使用 boost::serialization 时如何刷新文件缓冲区?

Posted

技术标签:

【中文标题】使用 boost::serialization 时如何刷新文件缓冲区?【英文标题】:How to flush file buffers when using boost::serialization? 【发布时间】:2010-02-05 06:26:57 【问题描述】:

我正在将文件保存在 USB 驱动器上,并且需要确保它已完全写入以避免损坏,以防 USB 驱动器未正确移除。 好吧,我已经做了一些研究,似乎可以通过调用 FlushFileBuffers Win32 函数来实现。 但问题是,我正在使用 boost::serialization 进行保存,因此无法访问实际文件 HANDLE。 我想知道刷新文件的正确方法是什么?谢谢!

【问题讨论】:

【参考方案1】:

在您创建存档对象的输出流上调用 ostream::flush:

// create and open a character archive for output
std::ofstream ofs("filename");
boost::archive::text_oarchive oa(ofs);

...

ofs.flush();

您也可以让对象超出应该刷新所有内容的范围:


    // create and open a character archive for output
    std::ofstream ofs("filename");
    boost::archive::text_oarchive oa(ofs);

    // going out of scope flushes the data

请注意,您仍然需要正确卸载 USB 设备。刷新数据只是确保它从用户空间进入内核,但内核也可以自己做缓冲。

【讨论】:

感谢您的回答!即使驱动器未正确卸载,是否有任何方法可以保证文件保存,例如暂时关闭卷上的写入缓存? @Alex - 不幸的是,我不知道如何在 Windows 中做到这一点(或者甚至可能)。我建议将其作为新问题提出。 @Alex:不。从根本上说,这是一个 FAT 问题。为此,您需要一个事务性文件系统,例如 Ext3/exFAT。你当然可以提高赔率。例如。在音量句柄上调用FlushFileBuffers,并使用FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH 标志调用CreateFile 函数。

以上是关于使用 boost::serialization 时如何刷新文件缓冲区?的主要内容,如果未能解决你的问题,请参考以下文章

对 boost::serialization 的未定义引用

使用 boost::serialization 保存数据时出现 Seg 错误

我可以告诉 Boost.MPI 哪个类版本与 Boost.Serialization 一起使用吗?

为什么我不能编译Boost.Serialization演示?

如何使用 boost::serialization 序列化 std::vector?

如何为 boost::serialization 指定一个 nvp 包装器?