我有以下逻辑,每 20 分钟通过 Timer 调用一次,它将对象的内容序列化为文件路径,我看到的 filePath 是 \hard disk\logs\applicationstate.xml ,请注意我确认这是一个有效的路径..
它在大多数情况下都有效,但我时不时地通过以下堆栈堆栈跟踪得到System.IO.IOeException
在线:this.StreamWriter = new StreamWriter(filePath);
在 System.IO.__Error.WinIOError(Int32 errorCode, String str)\r\n at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, Boolean useAsync, String msgPath) \r\n 在 System.IO.FileStream..ctor(字符串路径,FileMode 模式,FileAccess 访问,FileShare 共享,Int32 bufferSize)\r\n 在 System.IO.StreamWriter.CreateFile(字符串路径,布尔附加)\r \n
在 System.IO.StreamWriter..ctor(String path, Boolean append, Encoding encoding, Int32 bufferSize)\r\n 在 System.IO.StreamWriter..ctor(String path)\r\n 在 Shs.ScanPanel。 CA.DataManager.DataManagercr.CopyData(对象数据)\r\n
at System.Threading.Timer.ring()\r\n"
当它发生时,我看到 \hard disk\logs\applicationstate.xml 存在,但它有 0 字节。
所以我的问题是,StreamWriter 会导致这个 0 字节文件首先生成吗?我在 MSDN 上的 StreamWriter 下阅读了 IOException,它说以下内容
IOException
路径包含文件名、目录名或卷标语法的错误或无效语法。
这让我很困惑,是不是因为它试图打开一个 0 字节文件的流写入器?这个 0 字节是否会在最后一次运行此代码时生成一个空对象被序列化到文件中的位置?如果是这样,为什么我在 Visual Studio 中没有看到该异常?
if (filePath != string.Empty)
{
if (this.StateObject == null)
{
this.StateObject = new State();
}
//Do something to my StateObject object
this.StreamWriter = new StreamWriter(filePath);
this.Serializer = new XmlSerializer(typeof(State));
this.Serializer.Serialize(this.StreamWriter, this.StateObject);
}
else
{
if (this.log != null)
{
this.log.Write(LogLevel.Error, this.componentName, "CopyData : Unable to initilize State Object");
}
}
}
else
{
if (this.log != null)
{
this.log.Write(LogLevel.Error, this.componentName, "CopyData : Error while retrieving Current working directory");
}
}
}
catch (Exception ex)
{
if (this.log != null)
{
this.log.Write(ex, this.componentName);
}
}
finally
{
if (this.StreamWriter != null)
{
this.StreamWriter.Close();
}
}