我有以下逻辑,通过Timer每20分钟调用一次,它将对象的内容序列化为文件路径,我看到的文件路径是\ hard disk \ logs \ applicationstate.xml,请注意我确认这是一条有效的道路..
它大部分时间都可以工作,但我不时地在System.IO.IOeException
行上获得this.StreamWriter = new StreamWriter(filePath);
,其中包含以下堆栈跟踪:
at 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(String path,FileMode 模式,FileAccess访问,FileShare共享,Int32 bufferSize)\ r \ n at System.IO.StreamWriter.CreateFile(String path,Boolean append)\ r \ n
在System.IO.StreamWriter..ctor(String path,Boolean append,Encoding encoding,Int32 bufferSize)\ r \ n at System.IO.StreamWriter..ctor(String path)\ r \ n at Shs.ScanPanel.CA.DataManager.DataManagercr.CopyData(对象数据)\ r \ n
在System.Threading.Timer.ring()\ r \ n“
当它发生时,我看到\ hard disk \ logs \ applicationstate.xml存在,但它有0字节。
所以我的问题是,StreamWriter是否会导致首先生成这个0字节文件?我在MSDN上的StreamWriter下阅读了IOException,并说明了以下内容
IOException的
path包含文件名,目录名或卷标语法的错误或无效语法。
这让我很困惑,是因为它试图将流编写器打开到0字节文件?这个代码最后一次运行时生成的这个0字节可以将null对象序列化到文件中吗?如果是这样,我为什么不在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();
}
}
答案 0 :(得分:0)
我建议使用 this.StreamWriter.Flush()来确保写入所有内容。
但是你的异常似乎是在抱怨路径不正确。
编辑:Opps我错过了WinCE标签
答案 1 :(得分:0)
所以我写了一个小程序,我确认使文件有0字节的行就在this.StreamWriter = new StreamWriter(filePath);
但真正令我困惑的是它成功地清除了文件,以便新数据可以序列化到它中,但同时它会引发异常。我认为这是StreamWriter api的较低层,或者它可能是闪存驱动器的东西....毕竟我在WINDOW CE上运行这个程序