在Windows上强制流文件刷新

时间:2010-12-17 17:18:39

标签: c++ visual-studio visual-c++ windows-7

我正在使用ofstream将数据写入文件。我经常在文件上调用flush,但后面的备份文件并不总是更新。我认为这与OS级缓存或MSVC库中的某些内容有关。

我需要一种方法让数据在那时正确刷新。最好写入光盘,但至少足以使来自另一个程序的复制操作看到所有数据直到刷新点。

我可以用什么API来做到这一点?

4 个答案:

答案 0 :(得分:1)

FlushFileBuffers将刷新Windows写文件缓存并将其写入文件。请注意,如果重复调用它可能会非常慢。

我还发现了这篇KB文章,其中介绍了_commit()的用法。由于您正在使用ofstream,这可能对您更有用。

CXXFileBuf.flush();
_commit(CXXFileBuf.rdbuf()->fd());

答案 1 :(得分:0)

如果这是仅限Windows的解决方案,您可能需要使用FlushFileBuffers()。这意味着您必须重新编写一些代码以容纳对CreateFile()WriteFile()等的调用。如果您的应用程序依赖于许多不同的operator<<函数,您可以编写自己的代码std::streambuf

您也可能需要仔细阅读备注部分。特别是,

  

由于系统内的磁盘缓存交互,当在每次写入磁盘驱动器设备时使用FlushFileBuffers函数时,如果单独执行许多写操作,则FlushFileBuffers函数可能效率低下。如果应用程序正在对磁盘执行多次写入,并且还需要确保将关键数据写入持久性介质,则应用程序应使用无缓冲的I / O,而不是经常调用{{1}}。

答案 2 :(得分:0)

我用过:

MyOfstreamObject.rdbuf()->pubsync();

我在Win 7上使用stl_port和ICC 9.1。

我没有广泛测试过这个解决方案,但似乎有用......也许它可以解决edA-qa mort-ora-y注意到fd()缺失的问题。

答案 3 :(得分:0)

只需将commode.obj添加到Linker-&gt;输入 - &gt; Visual Studio中项目属性页中的其他依赖项,然后调用std::ostream::flush()。这样std :: ostream的刷新将链接另一个具有所需行为的方法。这对我有什么帮助。