TFileStream提供缓冲输出,这在大多数情况下都很好,但在某些情况下(特别是在调试期间),立即刷新缓冲区是很好的。问题是,除了调用Free之外,我不知道有什么方法可以做到这一点,这是一种适得其反的做法。
有没有更好的方法呢?
发布于 2009-04-24 10:30:53
你需要冲洗这条小溪。尝试:
FlushFileBuffers(fs.Handle);
?你看过/试过这个吗?
发布于 2009-04-24 10:47:16
我认为altCognito的答案(FlushFileBuffers)可能是最好的,但这只是因为TFileStream本身不做缓冲。对于其他缓冲的流,应该首先查看流是否提供了Flush方法。作为最后的手段,您可能会使用Seek(Begin)然后Seek(CurrentPos)的老把戏。
发布于 2009-04-24 12:59:32
这有点复杂,但实际上您可以在(win32应用程序接口) CreateFile的调用中控制很多行为。您可以添加FILE_FLAG_WRITE_THROUGH
/ FILE_FLAG_NO_BUFFERING
,甚至可以使用FILE_FLAG_SEQUENTIAL_SCAN
或FILE_FLAG_RANDOM_ACCESS
为缓存系统提供优化提示。要以这种方式使用TFileStream,我认为您需要覆盖Create来更改它获取文件句柄的方式。FlushFileBuffers相当于文件上的关闭/打开。如果你做了很多重复刷新的活动,这会大大减慢代码的速度。
一些文档here
https://stackoverflow.com/questions/787019
复制相似问题