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