【问题标题】:How to flush a TFileStream?如何刷新 TFileStream?
【发布时间】:2010-10-21 16:23:25
【问题描述】:

TFileStream 提供缓冲输出,这在大多数情况下都很棒,但在某些情况下(尤其是在调试期间)最好立即刷新缓冲区。问题是,除了调用 Free 之外,我不知道有什么方法可以做到这一点,这会适得其反。

有没有更好的方法?

【问题讨论】:

    标签: delphi buffer flush tfilestream


    【解决方案1】:

    您是使用 TWriter/TReader 还是直接使用 TFileStream 接口? TReader 和 TWriter 有内部缓冲区。但是对于普通的文件流,上面的回复对其进行了排序。我个人会使用直接处理它的方法来实现我自己的流。

    【讨论】:

      【解决方案2】:

      这有点复杂,但实际上您可以在调用 (win32 api) CreateFile 时控制很多这种行为。您可以添加FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING,甚至可以使用FILE_FLAG_SEQUENTIAL_SCANFILE_FLAG_RANDOM_ACCESS 为缓存系统提供优化提示。要以这种方式使用 TFileStream,我认为您需要覆盖 Create 以更改它获取文件句柄的方式。 FWIW,FlushFileBuffers 相当于文件上的关闭/打开。如果您通过重复刷新进行大量活动,则会大大减慢代码速度。

      一点文档here

      【讨论】:

      • 其实不需要重写构造函数。已经有一个重载版本,它接受一个文件句柄。因此,您必须执行以下操作(已删除错误处理): FS := TFileStream.Create( CreateFile( PChar(FileName), ... , FILE_FLAG_WRITE_THROUGH, ... ) );就这样。真的很简单。
      【解决方案3】:

      我认为 altCognito 的答案 (FlushFileBuffers) 可能是最好的,但这只是因为 TFileStream 本身没有缓冲。对于其他缓冲流,应首先查看流是否提供了 Flush 方法。作为最后的手段,您可能会使用 Seek(Begin) 然后 Seek(CurrentPos) 的旧技巧。

      【讨论】:

        【解决方案4】:

        您需要刷新流。试试:

         FlushFileBuffers(fs.Handle); 
        

        ?你看到/尝试过这个吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-05-29
          • 2017-10-12
          • 1970-01-01
          • 2014-04-23
          • 1970-01-01
          • 2013-03-20
          • 1970-01-01
          • 2021-05-04
          相关资源
          最近更新 更多