結論から書きます。
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:というのは、正常に動作したりしなかったり、極悪な動作をするためです!(半ギレ