我应该在追加写入之间保持文件处理程序打开吗?

时间:2015-03-05 14:56:15

标签: c# file-io data-acquisition

我正在从事涉及数据采集的项目。一个非常重要的要求如下所述:

  1. 在录制开始时,必须创建一个文件,并且必须写入其标题;
  2. 一旦数据采集开始,应用程序应该定期将收集的数据保存到文件中(通常每秒一次);
  3. 写作包括将数据块附加到文件中,如果可能的话,以原子方式;
  4. 如果发生任何错误(程序错误,电源故障),文件必须保持有效,直到错误发生前的最后一次写入。
  5. 所以我打算使用一些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. 这些形式中的任何一种都被视为特别好或坏的做法,或者根据手头问题的具体情况可以使用?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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