2009-04-24 75 views
16

TFileStream提供缓冲输出,这在大多数情况下都很棒,但在某些情况下(特别是在调试期间),立即刷新缓冲区很不错。事情是,除了打电话给Free,我不知道有什么办法可以做到这一点,这种做法适得其反。如何刷新TFileStream?

有没有更好的方法来做到这一点?

回答

25

您需要刷新流。试试:

FlushFileBuffers(fs.Handle); 

?你看到/尝试过吗?

6

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

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

+5

其实,你不需要重写构造函数。已经有一个重载的版本,它接受一个文件句柄。因此,您必须按照以下步骤操作(删除错误处理): FS:= TFileStream.Create(CreateFile(PChar(FileName),...,FILE_FLAG_WRITE_THROUGH,...)); 就是这样。真的很简单。 – Alex 2009-04-25 06:46:14

2

您使用的是TWriter /踏浪号或只是直行的TFileStream的界面? TReader和TWriter具有内部缓冲区。但对于一个普通的文件流,然后上面的回复将它排序。我个人会用自己的方法直接处理它。