2010-02-05 67 views
0

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

回答

2

调用的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进入内核,但内核也可以自己进行缓冲。

+0

感谢您的回答!即使驱动器未正确卸载,是否有任何方法可以保证文件保存,例如临时关闭卷上的写入缓存? – 2010-02-05 07:20:10

+0

@Alex - 不幸的是,我不知道如何在Windows中做到这一点(或者甚至可能)。我建议将这作为一个新问题。 – 2010-02-05 07:26:03

+1

@亚历克斯:不。从根本上说这是一个FAT问题。您需要一个交易文件系统,如Ext3/exFAT。你当然可以提高赔率。例如。调用卷处理中的'FlushFileBuffers',并用'FILE_FLAG_NO_BUFFERING |'调用'CreateFile'函数。 FILE_FLAG_WRITE_THROUGH'标志。 – MSalters 2010-02-05 09:29:48