2010-04-16 78 views
3

在我的程序中,我正在編寫我的程序狀態文件。 我在程序運行期間多次將文件寫入文件,因爲程序更改了一些我需要頻繁存儲的變量。如何在Windows上使用C++編程恢復電源故障

現在,如果由於某些原因我的電源故障。 然後大部分時間我都會丟失該文件中的數據。

請告訴我,即使電源故障,也可以保護數據的任何機制。 (我在Windows上編寫了C++程序)。

謝謝

回答

2

使用事務數據庫,如SQL Server。定期將更改提交到數據庫。當數據庫服務器斷電時,數據很可能不會損壞,但爲防萬一,定期進行備份是明智的。

+0

-1這不會保護您免受電源故障,因爲它不能確保數據寫入磁盤。 – Artyom 2010-04-16 15:19:59

+0

@Artyom:足夠公平,但您的解決方案沒有提及備份。 – 2010-04-17 08:17:39

0

Flush文件,儘可能多,或者得到一個UPS;)

+0

UPS不能防止程序或操作系統崩潰,而且這些都比我的世界中的電源故障情況要普遍得多。主要是程序崩潰。 – 2010-04-16 15:10:31

0

至於建議,你可以使用一個交易數據庫來跟蹤狀態。如果由於各種原因,你想堅持一個正常的文件:

我會建議使用基於事務的數據文件,總是附加到,而不是一個你不斷重寫。換句話說,當你第一次創建文件時,把完整的數據集寫成一個起始狀態。然後,對於程序寫入的每個更改,保留現有文件並僅附加更改(例如,將變量B更改爲42),而不是重寫整個文件。當文件達到特定大小時,您將關閉它,以當前滿狀態開始一個新文件,然後重複。

恢復會稍微複雜一些,因爲您必須恢復整個狀態文件,但如果有任何數據(經常刷新),則不會丟失太多數據。

0

SQLite是一個很好的選擇,如果您目前每個安裝使用一個平面文件。這是一個公共領域的單一文件數據庫,其設計爲ACID-compliant,包括數據寫入期間對電源故障的恢復能力。它有各種各樣的C++ APIs

0

您需要使用FlushFileBuffers(win32 API)或POSIX fsync(用於POSIX OS)以確保數據以物理方式寫入磁盤。一旦你調用它,你可能會確信數據是持久的。這就像ACID的窮人D一樣。

但請注意,此功能非常緩慢......小心使用。