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