如何刷新TFileStream?

时间:2009-04-24 18:23:02

标签: delphi buffer flush tfilestream

TFileStream提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间),立即刷新缓冲区会很好。事情是,除了打电话给Free之外,我不知道有什么方法可以做到这一点,这会产生相反的效果。

有更好的方法吗?

4 个答案:

答案 0 :(得分:27)

您需要刷新流。尝试:

 FlushFileBuffers(fs.Handle); 

?你有没有看到/尝试过这个?

答案 1 :(得分:6)

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

答案 2 :(得分:6)

它有点涉及,但实际上你可以在调用(win32 api)CreateFile时控制很多行为。您可以添加FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING,甚至可以使用FILE_FLAG_SEQUENTIAL_SCANFILE_FLAG_RANDOM_ACCESS向缓存系统提供优化提示。要以这种方式使用TFileStream,我认为你需要覆盖Create来改变它获取文件句柄的方式。 FWIW,FlushFileBuffers相当于文件中的Close / Open。如果你在重复刷新时做了很多活动,它会大大减慢代码的速度。

一些文档here

答案 3 :(得分:2)

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