2010-02-05 65 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