FlushFileBuffers已经写入的文件

时间:2012-01-28 18:18:39

标签: c++ file winapi io flush

我有一个将其结构写入文件的组件。 问题是他写的数据在任何系统故障时都需要保持一致。 所以我需要物理写入数据。 问题是该组件没有这样的选项,并且从组件数据中创建文件管理器功能将花费一些时间并且会使程序复杂化。

问题是: 如果我用组件编写数据(例如:ComponentX-> WriteToFile(filename)),那么我可以使用Handle = OpenFile(文件名)然后使用FlushFileBuffers(Handle)来确保数据的一致性吗?或者这个技巧不起作用?

我认为这可能有效,因为可能在OpenFile中,系统使用缓存中已有的句柄并刷新它将导致保存前一个操作的缓存数据(组件文件保存),但我不确定。

如果这可能不起作用是否有任何其他方法,而不是由我自己从组件中生成数据(使用CreateFile,...)

1 个答案:

答案 0 :(得分:1)

没有冲洗可以解决您的问题。如果在刷新缓冲区时系统冻结怎么办?

存在多种解决方案。您可以写入2个(或更多)交替文件,例如:您知道如果一个文件损坏,前一个文件可能会很好(除非在恢复方案期间出现一些丑陋的冻结)。如果您的检查点文件很小,这很有用。使用数据编写校验和有助于避免在恢复时产生疑问。

打开文件FILE_FLAG_NO_BUFFERING强制要求直接写入磁盘,避免系统直写缓存。这可能与之前的选项一致,因为系统在检查点期间可能仍会失败,从而损坏整个文件。

接下来,Windows具有高性能且易于使用的transactional file system

最后,如果您无法访问检查点的写入方式,只需设置一些备份例程,然后将检查点文件保存到检查点之间的另一个驱动器中。如果文件是滞后的,你可以使用一些热备份程序,可用的价格在0美元到100美元以下。 Windows Robocopy实用程序可能完全符合您的要求。