バイナリライターを使用して、いくつかの uint とバイト配列で構成されるレコードをファイルに書き込むメソッドがあります。このメソッドは、プログラムの一部として 1 秒間に約 10 回実行されます。コードは以下のとおりです。
iLogFileMutex.WaitOne();
using (BinaryWriter iBinaryWriter = new BinaryWriter(File.Open(iMainLogFilename, FileMode.OpenOrCreate, FileAccess.Write)))
{
iBinaryWriter.Seek(0, SeekOrigin.End);
foreach (ViewerRecord vR in aViewerRecords)
{
iBinaryWriter.Write(vR.Id);
iBinaryWriter.Write(vR.Timestamp);
iBinaryWriter.Write(vR.PayloadLength);
iBinaryWriter.Write(vR.Payload);
}
}
iLogFileMutex.ReleaseMutex();
上記のコードは正常に動作しますが、シーク呼び出しのある行を削除すると、結果のバイナリ ファイルが破損します。たとえば、特定のレコードが完全に欠落しているか、レコードの一部が存在しないだけで、大部分のレコードは問題なく書き込まれています。したがって、バグの原因は、ファイルを繰り返し開いたり閉じたりすると、ファイル内の現在の位置が常に最後にあるとは限らず、上書きされてしまうことだと思います。
私の質問は、ファイルを開いたときに現在の位置が最後にあることを C# が保証しないのはなぜですか?
PS: スレッド化の問題がこのバグの原因である可能性を除外しました