FlushFileBuffers 在将数据保存到磁盘时与 CloseHandle 然后 CreateFile 一样好?

问题描述 投票:0回答:3

对于磁盘上的文件,Win32 函数 FlushFileBuffers 是否与使用 CloseHandle 关闭文件然后使用 CreateFile 重新打开文件一样可靠和确定?

是否存在 CloseHandle 然后 CreateFile 更好的情况,因为它们可以将数据正确保存到磁盘,而 FlushFileBuffers 却不能?

winapi buffering disk-io
3个回答
8
投票

更好的是,CloseHandle() 不会刷新文件系统缓存写入缓冲区。请注意成本,将数据传输到磁盘可能需要很长时间。 CreateFile 的 FILE_FLAG_NO_BUFFERING 选项允许您避免刷新。但由于书面数据的限制,它非常昂贵且难以正确。


2
投票

根据文档,FlushFileBuffers 确实将所有内容写入磁盘。不过,亲自测试一下可能并没有什么坏处。我过去做过 BRS 测试(大红色开关……PC 曾经有大红色开关),我发现它确实导致所有内容都被写入。调用 FlushFileBuffers 后,无需完全关闭即可关闭 PC。重新打开它,看看数据是否全部存在。该行为可能会因操作系统而改变(理论上它不应该......但你永远不知道)。很久以前我就做过这样的测试(是在 XP 上,甚至可能是 Windows 2000 上)。

我想这是不言而喻的,但您可能不想在您真正关心的工作站上进行此测试。


1
投票

虽然这些信息与 Delphi 无关,但地球上部署最多的 SQL 数据库,sqlite(例如在 Firefox 中使用)负责处理这些事情,您可以在这里阅读很多原子操作:http://www .sqlite.org/atomiccommit.html 下面引用了有关 FlushFileBuffers 的文章

9.2 不完整的磁盘刷新

SQLite 使用 fsync() 系统调用 Unix 和 FlushFileBuffers() 系统 调用 w32 以同步文件 系统缓冲区到磁盘氧化物上作为 如步骤 3.7 和步骤 3.10 所示。 不幸的是,我们收到了 报告称,这些都不是 接口的工作方式正如许多广告上所宣传的那样 系统。我们听说 FlushFileBuffers() 可以完全 使用注册表设置禁用 一些 Windows 版本。 ...

© www.soinside.com 2019 - 2024. All rights reserved.