2013-04-22 97 views
1

我有一個應用程序,它使用XElement對象的.Save(「path」)方法每隔500毫秒將數據存儲在XML文件中。 問題是:當發生突然關機時,文件的內容被刪除,因此在下次運行應用程序時文件無法使用。當突然關機發生時,XML文件數據丟失

如何防止/確保數據不會丟失?我在Windows 7上使用.NET 2010 C#

我做了一個實驗:而不是寫入我創建的同一個data.xml文件(通過從原始文件複製)一個新文件每次當從data.xml文件複製時電源關閉時,它會破壞以前創建的所有文件?!?!?

+1

您需要擁有業務事務的概念,以便在關閉的情況下從上一個良好的檢查點開始該流程。你需要改變你的問題以包含更多細節。通常,文件系統不是事務性的。 – 2013-04-22 20:34:53

+1

在突然關機的地方,您正在處理哪種基礎設施?你的意思是像權力的喪失?你沒有備用電池嗎? – tnw 2013-04-22 20:36:26

+0

坦克的答案/評論 - 我沒有備用電池,這是一個罕見的情況,必須得到治療。 – Yossi 2013-04-23 20:34:01

回答

4

我們假設你的文件是data.xml。不是一直寫入data.xml,而是寫入臨時文件data.xml.tmp,完成後將其重命名爲data.xml。但如果您已有data.xml文件,重命名將不起作用,因此您需要先刪除它,然後重命名該臨時文件。

那樣,data.xml將包含最後的安全數據。如果突然關機,則不完整的文件將是臨時的data.xml.tmp。如果您的程序稍後嘗試讀取該文件,並且沒有data.xml文件,則意味着在刪除和重命名操作之間發生了關閉,因此您必須改爲讀取臨時文件。我們知道這是安全的,否則會有一個data.xml文件。

+0

當data.xml存在時,不能將data.xml.tmp重命名爲data.xml。你能澄清在哪一步你刪除'data.xml' – I4V 2013-04-22 21:22:24

+0

@ I4V編輯答案 – 2013-04-22 21:39:20

+0

假設你在關閉後有'data.xml'和'data.xml.tmp'。你怎麼知道'data.xml.tmp'完全寫不出來?如果同時寫入'data.xml.tmp' – I4V 2013-04-22 21:48:52

1

您可以使用兩階段提交:

  1. 寫入新的XML文件中使用不同的名稱
  2. 刪除舊文件
  3. 重命名爲新的文件舊名稱

這樣,總是會有至少一個完整的文件。
如果重新啓動,並且標準名稱不存在,請檢查其他名稱。

+0

也許重寫覆蓋而不是刪除? – 2013-04-22 20:36:27

+0

@YuriyFaktorovich:如果你的文件系統安全地支持。 – SLaks 2013-04-22 20:36:52

+0

如果系統在「步驟1」之後崩潰,那該怎麼辦?你現在有兩個有效的文件? – I4V 2013-04-22 20:38:17

相關問題