0

我正在从事一个涉及数据采集的项目。一个非常重要的必要条件是这样描述的:

  1. 在开始录制时,必须创建一个文件,并且必须写入其标题;
  2. 一旦数据采集开始,应用程序应该定期将收集到的数据保存到文件中(通常每秒一次);
  3. 写入包括将数据块附加到文件中,如果可能的话,以原子方式;
  4. 如果发生任何错误(程序错误、电源故障),文件必须保持有效,直到错误前的最后一次写入。

所以我打算用一些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);
        }
    }
}

该应用程序应该在客户端机器上工作,其他进程的文件访问不应该是一个问题。我最担心的是:

  1. 做多次打开/关闭影响性能(注意典型的写入间隔是每秒一次);
  2. 在发生故障(包括明确的电源故障)时,哪一个最能确保文件完整性安全?
  3. 这些形式中的任何一种被认为是一种特别好的或坏的做法,还是可以根据手头问题的具体情况使用其中一种?
4

2 回答 2

2

在断电/等情况下保留文件内容的一个好方法是在每次写入后刷新文件流。这将确保您刚刚写入流的内容立即写入磁盘。

于 2017-09-12T20:51:29.330 回答
1

正如您所提到的,其他进程不会访问该文件,因此保持它打开不会使事情复杂化,而且它会更快。但是,请记住,如果应用程序崩溃,锁将保留在文件上,您可能需要根据您的情况进行相应的处理。

于 2015-03-05T15:45:21.483 回答