以下に、タイマーを介して 20 分ごとに呼び出される次のロジックを示します。オブジェクトのコンテンツをファイル パスにシリアル化します。表示される filePath は \hard disk\logs\applicationstate.xml です。有効なパス..
ほとんどの場合は機能しますが、時々、次のスタック スタック トレースが表示されますSystem.IO.IOeException
。this.StreamWriter = new StreamWriter(filePath);
System.IO.__Error.WinIOError (Int32 errorCode、文字列 str)\r\n で System.IO.FileStream..ctor (文字列パス、FileMode モード、FileAccess アクセス、FileShare 共有、Int32 bufferSize、ブール値 useAsync、文字列 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
path には、ファイル名、ディレクトリ名、またはボリューム ラベルの構文の不適切または無効な構文が含まれています。
これは私を混乱させました。これは、0 バイトのファイルに対してストリーム ライターを開こうとするためですか? null オブジェクトがファイルにシリアル化されていた場所で、このコードが最後に実行されたときに、この 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();
}
}