2009-11-10 110 views
0

我開發在C#中的一個工具,在一種情況下我開始編寫成XML文件繼續用我的工具,當我突然重新啓動我的機器在特定的XML文件被 損壞,原因是什麼的怎樣躲開它?文件處理問題

xmldocument x= new xmldocument(); 
x.open(); 
// change a value of the node every time 
x.save(); 
x=null 

這是我的代碼

回答

2

使用 「安全替代模式」。例如,更換foo.txt的

  • 寫入foo.new
  • 移動foo.txt的到foo.old
  • 移動foo.new到foo.txt的
  • 刪除foo.old

在任何時候,您至少有一個完整的有效文件。

(即幫助,如果你要定期編寫一個新的文件;對於追加,我會與答案提示XML是不是最好的前鋒你一路走來)檢查

0

您的檔案在應用程序關閉之前正確關閉。

此外,正如有人指出的那樣,一個XML文件必須正確地結束標記結束。

的更多細節也將是有益的,比如你用打開,寫入和關閉文件的代碼。

2

不要使用XML。

XML有一種語法不適合連續寫入同一個文件,因爲您總是需要最終的結束標記,除非文件完整(它永遠不會與日誌文件結合) , 例如)。

這意味着您將始終當您提前取消寫入(通過殺死進程或重新啓動計算機等)時,將獲取無效的XML文件。

我們也有類似的情況已有一段時間,定居在YAML作爲一個很好的格式允許簡單地附加到文件中。

+1

這證明不是如此 - 儘管你需要稍微有創意,是一個單一的文件需要但很好地形成,你可以欺騙和有它有開始和結束標記的包裝文件,然後包括在通過引用文件中的各個元素。這有一個好處,那就是你可以引用包裝文件並對它做很好的事情(比如使用XSLT進行渲染,對於日誌文件特別有用),使XML成爲首要的格式 – Murph 2009-11-10 11:45:43

+0

你甚至不需要那個創意。這就是'System.Xml.ConformanceLevel.Fragment'的用途:您可以創建一個'XmlReader',它可以愉快地處理沒有頂級元素的輸入流中的XML元素。您甚至可以將其用作XSLT轉換的輸入。 – 2009-11-10 21:22:10

0

的原因爲您的文件越來越損壞是由於崩潰,你永遠不會關閉它。 我記得解決了這樣一個問題,文件重疊標誌。但是這是在C++中使用方法CreateFile。