1

(オンライン データから) 閉じる前にファイルを削除して新しいファイルを作成する WPF/C# アプリを作成しています。問題は、新しいファイルの作成プロセスが完了する前、または開始する前に、アプリがランダムにクラッシュした場合に発生します。

アプリがクラッシュしたときに削除されたファイルが失われないように、コードで使用できるファイル回復の方法 (アプリの削除を取り消すだけでなく、アプリ内で実行するなど) はありますか?

より正確には、アプリの開始時に 4 つのファイルを削除し、アプリの終了時に新しいファイルを作成します。ただし、アプリが途中でクラッシュすると、ファイルが失われます。

この問題を防ぐにはどうすればよいですか?

ランダムなクラッシュの可能性を減らそうとしましたが、それでも時々発生します。

4

4 に答える 4

3

ファイルの紛失が心配な場合は、次のことができます。

  • 起動時A.txtに(たとえば)削除する前に、 そのコピーを作成し、削除したA.tmp
  • 閉じるときに、新しいファイルを作成tmpし、ディレクトリに存在するすべてのファイルを削除します。

このようにして、プログラムの実行中に何か問題が発生した場合、プログラムが再起動すると、tmp最後に作成されたことがわかるため、(必要に応じて) それらから情報を再構築し、プログラム サイクルを続行できます。

于 2012-11-05T11:12:48.047 に答える
2

起動時に、ファイルに対して何もしません。

シャットダウンしたら、次の手順に従います。

  1. などの名前の新しいファイルを作成しますOLDNAME.tmp。すでに存在する場合は、破棄して再作成します。
  2. MoveFileTransacted()MSDN)を介して古いファイルの新しいファイルの名前を変更します

のない古いバージョンの Windows で立ち往生している場合MoveFileTransacted()事態はさらに複雑になります。


注: POSIX 準拠のファイルシステムを使用している場合、標準の名前変更操作はアトミックであることが保証されているため、ステップ 2 は簡単です。

于 2012-11-05T11:14:58.637 に答える
1

ファイルを削除するのではなく、一時フォルダーに移動することを検討してください。削除を取り消すテクニックを発明することはできますが、ファイル システムは占有されていないスペースをいつでも書き換えることができるため、これは信頼できません。新しいファイルが届いたら、以前に移動したファイルを削除します。

于 2012-11-05T11:11:27.053 に答える
0

新しいファイルが作成されるまで、古いファイルを削除しませんか?代わりに、名前を変更してください。アプリを起動すると、古い(名前が変更された)ファイルがまだ残っているため、アプリがクラッシュしたかどうかがわかります。その後、整理された操作を実行できます。

于 2012-11-05T11:09:57.173 に答える