18

TFileStream 提供缓冲输出,这在大多数情况下都很棒,但在某些情况下(尤其是在调试期间)最好立即刷新缓冲区。问题是,除了调用 Free 之外,我不知道有任何方法可以做到这一点,这会适得其反。

有更好的方法吗?

4

4 回答 4

29

您需要刷新流。尝试:

 FlushFileBuffers(fs.Handle); 

? 你看到/尝试过这个吗?

于 2009-04-24T18:30:52.560 回答
6

这有点复杂,但实际上您可以在调用 (win32 api) CreateFile 时控制很多这种行为。您可以使用或向缓存系统添加FILE_FLAG_WRITE_THROUGH/FILE_FLAG_NO_BUFFERING甚至提供优化提示。要以这种方式使用 TFileStream,我认为您需要覆盖 Create 以更改它获取文件句柄的方式。FWIW,FlushFileBuffers 相当于文件的关闭/打开。如果您通过重复刷新进行大量活动,则会大大减慢代码速度。FILE_FLAG_SEQUENTIAL_SCANFILE_FLAG_RANDOM_ACCESS

这里有一些文档

于 2009-04-24T20:59:31.640 回答
6

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

于 2009-04-24T18:47:15.827 回答
2

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

于 2011-05-12T15:59:10.493 回答