使用 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 保存数据时出现 Seg 错误
我可以告诉 Boost.MPI 哪个类版本与 Boost.Serialization 一起使用吗?
为什么我不能编译Boost.Serialization演示?