我正在从事一个涉及数据采集的项目。一个非常重要的必要条件是这样描述的:
- 在开始录制时,必须创建一个文件,并且必须写入其标题;
- 一旦数据采集开始,应用程序应该定期将收集到的数据保存到文件中(通常每秒一次);
- 写入包括将数据块附加到文件中,如果可能的话,以原子方式;
- 如果发生任何错误(程序错误、电源故障),文件必须保持有效,直到错误前的最后一次写入。
所以我打算用一些Thread来观察接收到的数据并写这个数据做文件,但是我不知道哪种做法最好(下面的代码不是真实的,只是为了感受一下):
第一种选择:单开
using (var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write))
fs.Write(headers, 0, headers.Length);
using (var fs = new FileStream(filename, FileMode.Append, FileAccess.Write))
{
while (acquisitionRunning)
{
Thread.Sleep(100);
if (getNewData(out _someData;))
{
fs.Write(_someData, 0, _someData.Length);
}
}
}
第二种选择:多开:
using (var fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write))
fs.Write(headers, 0, headers.Length);
while (acquisitionRunning)
{
Thread.Sleep(100);
if (getNewData(out _someData;))
{
using (var fs = new FileStream(filename, FileMode.Append, FileAccess.Write))
{
fs.Write(_someData, 0, _someData.Length);
}
}
}
该应用程序应该在客户端机器上工作,其他进程的文件访问不应该是一个问题。我最担心的是:
- 做多次打开/关闭影响性能(注意典型的写入间隔是每秒一次);
- 在发生故障(包括明确的电源故障)时,哪一个最能确保文件完整性安全?
- 这些形式中的任何一种被认为是一种特别好的或坏的做法,还是可以根据手头问题的具体情况使用其中一种?