【发布时间】:2010-10-21 16:23:25
【问题描述】:
TFileStream 提供缓冲输出,这在大多数情况下都很棒,但在某些情况下(尤其是在调试期间)最好立即刷新缓冲区。问题是,除了调用 Free 之外,我不知道有什么方法可以做到这一点,这会适得其反。
有没有更好的方法?
【问题讨论】:
标签: delphi buffer flush tfilestream
TFileStream 提供缓冲输出,这在大多数情况下都很棒,但在某些情况下(尤其是在调试期间)最好立即刷新缓冲区。问题是,除了调用 Free 之外,我不知道有什么方法可以做到这一点,这会适得其反。
有没有更好的方法?
【问题讨论】:
标签: delphi buffer flush tfilestream
您是使用 TWriter/TReader 还是直接使用 TFileStream 接口? TReader 和 TWriter 有内部缓冲区。但是对于普通的文件流,上面的回复对其进行了排序。我个人会使用直接处理它的方法来实现我自己的流。
【讨论】:
这有点复杂,但实际上您可以在调用 (win32 api) CreateFile 时控制很多这种行为。您可以添加FILE_FLAG_WRITE_THROUGH / FILE_FLAG_NO_BUFFERING,甚至可以使用FILE_FLAG_SEQUENTIAL_SCAN 或FILE_FLAG_RANDOM_ACCESS 为缓存系统提供优化提示。要以这种方式使用 TFileStream,我认为您需要覆盖 Create 以更改它获取文件句柄的方式。 FWIW,FlushFileBuffers 相当于文件上的关闭/打开。如果您通过重复刷新进行大量活动,则会大大减慢代码速度。
一点文档here
【讨论】:
我认为 altCognito 的答案 (FlushFileBuffers) 可能是最好的,但这只是因为 TFileStream 本身没有缓冲。对于其他缓冲流,应首先查看流是否提供了 Flush 方法。作为最后的手段,您可能会使用 Seek(Begin) 然后 Seek(CurrentPos) 的旧技巧。
【讨论】:
您需要刷新流。试试:
FlushFileBuffers(fs.Handle);
?你看到/尝试过这个吗?
【讨论】: