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

C# 我应该在追加写入之间保持文件处理程序打开吗?,c#,file-io,data-acquisition,C#,File Io,Data Acquisition,我在一个涉及数据采集的项目中工作。下面描述了一个非常重要的必要条件: 在录制开始时,必须创建一个文件,并写入其标题 一旦数据采集开始,应用程序应定期(通常每秒一次)将收集的数据保存到文件中 写入过程包括在文件中添加数据块,如果可能的话,采用原子方式 如果发生任何错误(程序错误、电源故障),文件必须保持有效,直到错误发生前的最后一次写入 因此,我计划使用一些线程来观察接收到的数据,并编写这个数据do文件,但我不知道哪种做法最好(下面的代码不是真实的,只是为了得到感觉): 第一种选择:单一开放式 u

我在一个涉及数据采集的项目中工作。下面描述了一个非常重要的必要条件:

  • 在录制开始时,必须创建一个文件,并写入其标题
  • 一旦数据采集开始,应用程序应定期(通常每秒一次)将收集的数据保存到文件中
  • 写入过程包括在文件中添加数据块,如果可能的话,采用原子方式
  • 如果发生任何错误(程序错误、电源故障),文件必须保持有效,直到错误发生前的最后一次写入
  • 因此,我计划使用一些线程来观察接收到的数据,并编写这个数据do文件,但我不知道哪种做法最好(下面的代码不是真实的,只是为了得到感觉):

    第一种选择:单一开放式

    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);
            }
        }
    }
    
    应用程序应该在客户机中工作,而其他进程对文件的访问不应该引起关注。我最关心的是:

  • 执行多次打开/关闭影响性能(请注意,典型的写入间隔为每秒一次)
  • 在发生故障(包括明确的电源故障)时,哪种方法最能保证文件完整性的安全
  • 这两种形式中有哪一种被认为是特别好的或不好的做法,或者根据手头问题的具体情况可以使用哪一种

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

    如您所述,其他进程将无法访问该文件,因此保持文件打开不会使事情复杂化,也会更快。但是,请记住,如果应用程序崩溃,锁将保留在文件上,您可能需要根据您的场景相应地处理此问题。

    如您所述,其他进程将无法访问该文件,因此保持文件打开不会使事情复杂化,也会更快。但是,请记住,如果应用程序崩溃,锁将保留在文件上,您可能需要根据您的场景相应地处理此问题。

    如您所述,其他进程将无法访问该文件,因此保持文件打开不会使事情复杂化,也会更快。但是,请记住,如果应用程序崩溃,锁将保留在文件上,您可能需要根据您的场景相应地处理此问题。

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

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

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

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

    密切相关,但使用perl(C#会有所不同吗?):问得好。1.多次打开和关闭文件会影响性能。e、 在硬盘上查找文件需要时间。2.我可以确认,如果将时间分散到对多个文件执行磁盘访问(读/写)时,其中一个文件因电源故障而损坏的可能性会增加。3.根据手头的具体问题,两者都可以使用。密切相关,但使用perl(C#会有所不同吗?):好问题。1.多次打开和关闭文件会影响性能。e、 在硬盘上查找文件需要时间。2.我可以确认,如果将时间分散到对多个文件执行磁盘访问(读/写)时,其中一个文件因电源故障而损坏的可能性会增加。3.根据手头的具体问题,两者都可以使用。密切相关,但使用perl(C#会有所不同吗?):好问题。1.多次打开和关闭文件会影响性能。e、 在硬盘上查找文件需要时间。2.我可以确认,如果将时间分散到对多个文件执行磁盘访问(读/写)时,其中一个文件因电源故障而损坏的可能性会增加。3.根据手头的具体问题,两者都可以使用。密切相关,但使用perl(C#会有所不同吗?):好问题。1.多次打开和关闭文件会影响性能。e、 在硬盘上查找文件需要时间。2.我可以确认,如果将时间分散到对多个文件执行磁盘访问(读/写)时,其中一个文件因电源故障而损坏的可能性会增加。3.根据手头的具体问题,可以使用这两种方法。除了锁定问题(我将研究一下如何处理这个问题)之外,自上次写入以来,文件内容的完整性是否会被保留?它可能会使文件处于损坏状态。但在某些情况下,这也是可以接受的。您可能应该检查log4net如何实现文件锁定。这将为您带来一些额外的选项和想法。除了锁定问题(我将研究一下如何处理这个问题),自上次写入以来,文件内容的完整性是否会被保留?它可能会使文件处于损坏状态。但在某些情况下,这也是可以接受的。您可能应该检查log4net如何实现文件锁定。这将为您带来一些额外的选择和想法。除了锁定问题(我将重新讨论)