代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

如何刷新tfilestream?

  •  16
  • Mason Wheeler  · 技术社区  · 16 年前

    tfilestream提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间),最好立即刷新缓冲区。事情是,我不知道怎么做,除了打免费电话,这有点适得其反。

    有更好的方法吗?

    4 回复  |  直到 14 年前
        1
  •  27
  •   cgp    16 年前

    你需要冲洗这条小溪。尝试:

     FlushFileBuffers(fs.Handle); 
    

    ?你看到/试过这个吗?

        2
  •  6
  •   Henk Holterman    16 年前

    我认为altcognito的答案(flushfilebuffers)可能是最好的,但这仅仅是因为tfilestream本身没有缓冲。对于其他的缓冲流,流应该首先查看流是否提供了刷新方法。作为最后一种手段,您可能会使用旧的搜索技巧(begin),然后使用seek(currentpos)。

        3
  •  6
  •   Marshall Fryman    16 年前

    它有点复杂,但实际上您可以在调用(win32 api)createfile时控制很多这种行为。您可以添加 FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING 甚至为缓存系统提供优化提示 FILE_FLAG_SEQUENTIAL_SCAN FILE_FLAG_RANDOM_ACCESS . 要以这种方式使用tfilestream,我认为您需要重写create来更改它获取文件句柄的方式。fwiw,flushfilebuffers相当于文件的关闭/打开。如果您在重复刷新的情况下进行大量活动,那么这将大大降低代码的速度。

    一些文档 here

        4
  •  2
  •   Jon Lennart Aasenden    14 年前

    您是使用twriter/treader还是直接使用tfilestream接口?跑步机和twriter都有内部缓冲器。但是对于普通的文件流,上面的答复会对其进行排序。我个人会用方法实现我自己的流来直接处理它。

    推荐文章