在我的程序中,我正在編寫我的程序狀態文件。 我在程序運行期間多次將文件寫入文件,因爲程序更改了一些我需要頻繁存儲的變量。如何在Windows上使用C++編程恢復電源故障
現在,如果由於某些原因我的電源故障。 然後大部分時間我都會丟失該文件中的數據。
請告訴我,即使電源故障,也可以保護數據的任何機制。 (我在Windows上編寫了C++程序)。
謝謝
在我的程序中,我正在編寫我的程序狀態文件。 我在程序運行期間多次將文件寫入文件,因爲程序更改了一些我需要頻繁存儲的變量。如何在Windows上使用C++編程恢復電源故障
現在,如果由於某些原因我的電源故障。 然後大部分時間我都會丟失該文件中的數據。
請告訴我,即使電源故障,也可以保護數據的任何機制。 (我在Windows上編寫了C++程序)。
謝謝
使用事務數據庫,如SQL Server。定期將更改提交到數據庫。當數據庫服務器斷電時,數據很可能不會損壞,但爲防萬一,定期進行備份是明智的。
至於建議,你可以使用一個交易數據庫來跟蹤狀態。如果由於各種原因,你想堅持一個正常的文件:
我會建議使用基於事務的數據文件,總是附加到,而不是一個你不斷重寫。換句話說,當你第一次創建文件時,把完整的數據集寫成一個起始狀態。然後,對於程序寫入的每個更改,保留現有文件並僅附加更改(例如,將變量B更改爲42),而不是重寫整個文件。當文件達到特定大小時,您將關閉它,以當前滿狀態開始一個新文件,然後重複。
恢復會稍微複雜一些,因爲您必須恢復整個狀態文件,但如果有任何數據(經常刷新),則不會丟失太多數據。
SQLite是一個很好的選擇,如果您目前每個安裝使用一個平面文件。這是一個公共領域的單一文件數據庫,其設計爲ACID-compliant,包括數據寫入期間對電源故障的恢復能力。它有各種各樣的C++ APIs。
您需要使用FlushFileBuffers(win32 API)或POSIX fsync(用於POSIX OS)以確保數據以物理方式寫入磁盤。一旦你調用它,你可能會確信數據是持久的。這就像ACID的窮人D一樣。
但請注意,此功能非常緩慢......小心使用。
-1這不會保護您免受電源故障,因爲它不能確保數據寫入磁盤。 – Artyom 2010-04-16 15:19:59
@Artyom:足夠公平,但您的解決方案沒有提及備份。 – 2010-04-17 08:17:39