二进制文件不在流的末尾打开文件

我有一个方法,它使用二进制写入器将包含少量uint和字节数组的记录写入文件。作为我程序的一部分,此方法每秒执行大约十几次。代码如下:
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();
上面的代码工作正常,但是如果我使用seek调用删除该行,则生成的二进制文件已损坏。例如,虽然绝大多数记录都写得很好,但某些记录完全丢失或部分记录不存在。所以我想这个错误的原因是当我反复打开和关闭文件时,文件中的当前位置并不总是在最后,事情会被覆盖。 所以我的问题是:为什么C#确保当我打开文件时当前位置结束? PS:我已经排除了导致此错误的线程问题     
已邀请:
问题是FileMode.OpenOrCreate和ViewerRecord成员的类型的组合。其中一个或多个不是固定大小的类型,可能是一个字符串。 文件已存在时出错。您将开始在文件的开头写入数据,覆盖现有数据。但是你写的只是偶然覆盖现有的记录,字符串必须是完全相同的大小。如果您没有写足够的记录,那么您将不会覆盖所有旧记录。当您阅读文件时遇到麻烦,在阅读完最后的书面记录后,您将阅读旧记录的一部分。你会得到一段时间的垃圾。 使记录固定大小并不能真正解决问题,你会读到一个好的记录,但它将是一个旧记录。您将获得哪些特定的旧记录取决于您编写的新数据量。这应该与读取乱码数据一样糟糕。 如果确实需要保留旧记录,则应附加到文件FileMode.Append。如果不这样做,则应重写文件FileMode.Create。     
如果要附加到文件,则必须在Open调用中使用FileMode.Append,否则文件将打开,其位置设置为文件的开头,而不是结尾。     

要回复问题请先登录注册