【发布时间】:2011-05-27 06:17:14
【问题描述】:
我正在使用ofstream 将数据写入文件。我经常在文件上调用flush,但支持文件并不总是在那个时候得到更新。我认为这与操作系统级缓存或 MSVC 库中的某些内容有关。
我需要一种方法来正确刷新数据。最好写入磁盘,但至少足以让另一个程序的复制操作可以看到刷新点之前的所有数据。
我可以使用什么 API 来做到这一点?
【问题讨论】:
标签: c++ visual-studio visual-c++ windows-7
我正在使用ofstream 将数据写入文件。我经常在文件上调用flush,但支持文件并不总是在那个时候得到更新。我认为这与操作系统级缓存或 MSVC 库中的某些内容有关。
我需要一种方法来正确刷新数据。最好写入磁盘,但至少足以让另一个程序的复制操作可以看到刷新点之前的所有数据。
我可以使用什么 API 来做到这一点?
【问题讨论】:
标签: c++ visual-studio visual-c++ windows-7
FlushFileBuffers 将刷新 Windows 写入文件缓存并将其写入文件。请注意,如果重复调用它可能会很慢。
我还发现这篇KB 文章描述了_commit() 的使用。由于您使用的是 ofstream,这可能对您更有用。
CXXFileBuf.flush();
_commit(CXXFileBuf.rdbuf()->fd());
【讨论】:
fd 函数...?
->fd 有人怎么了?
如果这是仅限 Windows 的解决方案,您可能需要使用 FlushFileBuffers()。这意味着您将不得不重新编写一些代码以适应对CreateFile()、WriteFile() 等的调用。如果您的应用程序依赖于许多不同的operator<< 函数,您可以编写自己的std::streambuf。
您可能还需要仔细阅读备注部分。特别是,
由于系统内的磁盘缓存交互,在单独执行许多写入时,在每次写入磁盘驱动器设备后使用
FlushFileBuffers函数可能效率低下。如果应用程序正在对磁盘执行多次写入,并且还需要确保将关键数据写入持久性介质,则应用程序应使用无缓冲 I/O,而不是频繁调用FlushFileBuffers。
【讨论】:
我用过:
MyOfstreamObject.rdbuf()->pubsync();
我在带有 ICC 9.1 的 Win 7 上使用 stl_port。
我没有对这个解决方案进行广泛的测试,但它似乎可以工作......也许它可以解决 edA-qa mort-ora-y 注意到的 fd() 缺失的问题。
【讨论】:
只需将commode.obj 添加到Visual Studio 中项目属性页中的Linker->Input->Additional Dependencies 并调用std::ostream::flush()。这样,std::ostream 的刷新将链接到另一个具有所需行为的方法。这对我有帮助。
【讨论】: