2012-11-05 49 views
1

我正在創建一個WPF/C#應用程序,它在關閉(從在線數據)之前刪除文件並創建新的文件。當新文件創建過程完成或甚至開始之前,應用程序會隨機崩潰,問題就來了。應用程序崩潰時的文件恢復C#

是否有一種文件恢復方式(在應用程序內完成,而不僅僅是取消刪除應用程序等),我可以在我的代碼中使用,所以當應用程序崩潰被刪除的文件不能丟失?

爲了更加準確,我在應用程序開始時刪除4個文件,並在應用程序結尾創建新文件。但如果應用程序在中間崩潰,則文件丟失。

如何防止此問題?

我試圖減少隨機崩潰的概率,但偶爾還會發生。

+0

該解決方案將僅在新文件完成時刪除文件。 –

+0

我必須先刪除然後找到新文件,因爲它們是以相同名稱下載的(這是它們必須是的,它是類項目),所以在創建新文件之前必須重命名/刪除它們 –

回答

3

如果你warry一下,你可以失去的文件(S)的:對啓動A.txt(說)刪除

  • 之前創建它的副本A.tmp後刪除。
  • 關閉,創建新文件並刪除目錄中的所有tmp文件。

這樣,如果出事程序運行過程中出錯,程序再次啓動時,它會找到tmp最後創建的,所以可以從他們重建信息(如果需要),並繼續編程週期。

0

在創建新文件之前不要刪除舊文件嗎?改爲將它們重命名。當您啓動應用程序時,您會知道它是否因爲舊的(重命名的)文件仍然存在而崩潰,然後您可以執行任何整理操作。

1

考慮將文件移動到某個臨時文件夾,而不是刪除它們。您可以發明一些取消刪除的技術,但是這將不可靠,因爲文件系統可以隨時重寫未佔用的空間。新文件到達後,您將刪除先前移動的文件。

2

在啓動時,對文件不做任何事情。

在關閉時,遵循以下步驟:

  1. 創建新的文件,命名爲OLDNAME.tmp什麼的。如果它已經存在,則丟棄並重新創建它。
  2. 通過MoveFileTransacted()MSDN

重命名了舊的新的文件,如果你被困在一個老版本的Windows不MoveFileTransacted(),事情變得更加複雜:http://blogs.msdn.com/b/adioltean/archive/2005/12/28/507866.aspx


注意:如果你發現自己在一個符合POSIX的文件系統上,標準的重命名操作保證是原子的,這使得步驟2變得微不足道。

相關問題