C# ファイルの削除で注意すること

結論から書きます。

C# のファイル削除処理は非同期処理のような動作をしますので、削除後にファイル I/O 操作をする場合は、削除処理が実際に動作したか確認するコードを書きましょう。でないと痛い目に遭います。

悪い例:

  Directory.Delete(targetPath);

  Directory.CreateDirectory(targetPath);

こういう書き方はしてはいけません。
ほぼ 80% ぐらいで*1、例外が発生してアプリケーションが落ちます!
ちなみに、

  try
  {
    Directory.Delete(targetPath);
  }
  finally
  {
    Directory.CreateDirectory(targetPath);
  }

は無意味です。
このコードは削除処理の後に作成処理を呼び出すことは保証しますが、
実際にファイルが削除されたかは何も保証しないからです。


仕様なのかバグなのか知りませんが、どちらにせよ困った事態になるのは明らかですよ、
まったくもう!

ではどうやって解決したら良いのか「論よりコード」で書いてみましょう。

  dirInfo.Delete();

  while (dirInfo.Exists)
  {
    dirInfo.Refesh();
  }

  // 後続の I/O 処理

こうなります。

ファイルが存在する間無限ループすることにより、後続の I/O 処理が動作する前に、ファイルが削除された状態になるようにするので、非同期処理のような動作を止めさせることが出来ます。

本日の教訓

C# (.NET かな?) のファイル削除処理は非同期処理のように動作するので、
ファイル削除後にすぐにファイル I/O 処理をしたい場合は、ファイルが実際に削除されるまで無限ループして待機すべし!

*1:というのは、正常に動作したりしなかったり、極悪な動作をするためです!(半ギレ