如何刷新TFileStream?

Mas*_*ler 16 delphi buffer flush tfilestream

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

有没有更好的方法呢?

cgp*_*cgp 27

您需要刷新流.尝试:

 FlushFileBuffers(fs.Handle); 
Run Code Online (Sandbox Code Playgroud)

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


Hen*_*man 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.如果你在重复刷新时做了很多活动,它会大大减慢代码的速度.

这里有一些文档

  • 实际上,您不需要覆盖构造函数.已经有一个重载版本,它接受一个文件句柄.因此,您必须按照以下步骤进行操作(删除错误处理):FS:= TFileStream.Create(CreateFile(PChar(FileName),...,FILE_FLAG_WRITE_THROUGH,...)); 就这样.真的很简单. (5认同)