0
我正在将一个文件保存在USB驱动器上,并且需要确保它完全写入以避免USB驱动器未正确移除时发生损坏。 嗯,我已经做了一些研究,似乎可以通过调用FlushFileBuffers Win32函数。 但问题是,我使用boost :: serialization进行保存,因此无法访问实际的文件HANDLE。 我想知道刷新文件的正确方法是什么?谢谢!如何使用boost :: serialization刷新文件缓冲区?
我正在将一个文件保存在USB驱动器上,并且需要确保它完全写入以避免USB驱动器未正确移除时发生损坏。 嗯,我已经做了一些研究,似乎可以通过调用FlushFileBuffers Win32函数。 但问题是,我使用boost :: serialization进行保存,因此无法访问实际的文件HANDLE。 我想知道刷新文件的正确方法是什么?谢谢!如何使用boost :: serialization刷新文件缓冲区?
调用的ostream ::对你创建了归档对象的输出流平:
// 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设备。刷新数据只是确保它从userland进入内核,但内核也可以自己进行缓冲。
感谢您的回答!即使驱动器未正确卸载,是否有任何方法可以保证文件保存,例如临时关闭卷上的写入缓存? – 2010-02-05 07:20:10
@Alex - 不幸的是,我不知道如何在Windows中做到这一点(或者甚至可能)。我建议将这作为一个新问题。 – 2010-02-05 07:26:03
@亚历克斯:不。从根本上说这是一个FAT问题。您需要一个交易文件系统,如Ext3/exFAT。你当然可以提高赔率。例如。调用卷处理中的'FlushFileBuffers',并用'FILE_FLAG_NO_BUFFERING |'调用'CreateFile'函数。 FILE_FLAG_WRITE_THROUGH'标志。 – MSalters 2010-02-05 09:29:48