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