【问题标题】:Force ofstream file flush on Windows在 Windows 上强制流文件刷新
【发布时间】:2011-05-27 06:17:14
【问题描述】:

我正在使用ofstream 将数据写入文件。我经常在文件上调用flush,但支持文件并不总是在那个时候得到更新。我认为这与操作系统级缓存或 MSVC 库中的某些内容有关。

我需要一种方法来正确刷新数据。最好写入磁盘,但至少足以让另一个程序的复制操作可以看到刷新点之前的所有数据。

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

【问题讨论】:

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


    【解决方案1】:

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

    我还发现这篇KB 文章描述了_commit() 的使用。由于您使用的是 ofstream,这可能对您更有用。

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

    【讨论】:

    • stl 流中没有这样的fd 函数...?
    • ->fd 有人怎么了?
    【解决方案2】:

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

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

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

    【讨论】:

    • 不幸的是,它们似乎需要无缓冲模式才能正确调整大小和对齐块。真是太糟糕了。我将不得不反复调用 FlushFileBuffers。
    【解决方案3】:

    我用过:

    MyOfstreamObject.rdbuf()->pubsync();
    

    我在带有 ICC 9.1 的 Win 7 上使用 stl_port。

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

    【讨论】:

      【解决方案4】:

      只需将commode.obj 添加到Visual Studio 中项目属性页中的Linker->Input->Additional Dependencies 并调用std::ostream::flush()。这样,std::ostream 的刷新将链接到另一个具有所需行为的方法。这对我有帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-05
        • 2021-01-26
        • 2014-01-22
        • 1970-01-01
        • 2010-10-23
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多