我正在使用ofstream
将数据写入文件。我经常在文件上调用flush
,但后面的备份文件并不总是更新。我认为这与OS级缓存或MSVC库中的某些内容有关。
我需要一种方法让数据在那时正确刷新。最好写入光盘,但至少足以使来自另一个程序的复制操作看到所有数据直到刷新点。
我可以用什么API来做到这一点?
答案 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的刷新将链接另一个具有所需行为的方法。这对我有什么帮助。