2017-09-06 251 views
0

我正在使用File.WriteAllBytes將更改寫入文件。文件損壞停電後

如果在調用WriteAllBytes之後發生停電,則文件總是被損壞。 問題是,這不僅發生在我的Save函數執行期間,而且甚至在函數執行完成後 - 有時甚至在我調用Save之後的一個小時後。

我試過使用BinaryWriter,但我得到了相同的結果。我也嘗試通過使用臨時文件來實施解決方法。問題是File.Copy也具有相同的行爲 - 即如果我創建一個臨時文件,並且在運行時發生停電,文件將被損壞。

相反,我注意到,即使我在寫入文件之後從任務管理器中終止應用程序,該文件也不會被損壞,即使在我稱之爲Write之後的幾秒鐘內發生這種情況。

你碰巧知道爲什麼發生這種情況,也許提出一種解決方法?

+0

你有關閉文件嗎?或者你可以把你的代碼? – Karuntos

回答

0

據文檔,WriteAllBytes

創建一個新文件時,指定的字節數組寫入到文件,然後關閉該文件。如果目標文件已經存在,它將被覆蓋。

當然假設是由於文件被寫入和關閉了WriteAllBytes,所以它應該在該方法返回後立即可靠地在磁盤上。但由於文件系統緩存策略可能有效,這是一個錯誤的假設。此外,即使文件系統將緩存刷新到磁盤(並在「直寫」文件系統中),並且硬件已返回「成功」指示,也會在硬件緩存之前存在由硬件緩存引起的延遲(儘管時間很短)數據實際上是物理寫入磁盤的。

如果您的數據非常重要以至於必須在停電後繼續存在,請務必安裝UPS。

所有這些都說了,等了一個小時來拔插頭,仍然看到你的文件損壞聲音懷疑,也許這不是由於filelsystem緩存。您的邏輯中可能存在一個錯誤,或者內部或外部資源衝突。

我會嘗試一些事情。

  1. 設計的測試之後即驗證文件的完整性後立即WriteAllBytes回報,或者只要你能合理(最好不是你的應用程序內部,但在另一個applciation運行它旁邊)。
  2. 嘗試退出程序,等待幾分鐘,然後拔下插頭,看看該文件是否仍然存在損壞。
  3. 如果其他文件也由您的應用程序編寫,請驗證它們的完整性。他們是否也顯示腐敗?
  4. 嘗試編寫一個非常小的Windows測試程序,調用WriteAllBytes並掛起並在運行時拔下插頭。該文件是否損壞?
  5. 您的邏輯處理「電源故障」事件嗎?這是邏輯損壞你的文件。
  6. 是否存在虛擬機?你是在拔掉主機上的插頭,還是在客戶機操作系統上模擬停電?

最後,WriteAllBytes是一個廣泛使用的方法,不是很複雜。我懷疑這是造成你的問題。

0

經過一番搜索,我發現我一直在我的硬盤上使用寫緩存,因此有些文件在電源故障後不會被寫入。 由於性能在我的應用程序中非常關鍵,我決定讓它啓用,而我使用FileStreams,在需要時執行fs.Flush(True)。

雖然這通常被認爲是一個很好的做法嗎?