[.NET] Directory.Deleteで削除が非同期(時間差)で完了する

[.NET] Directory.Deleteで削除が非同期(時間差)で完了する

Directory.Deleteで削除されない

.NETには ディレクトリを削除する Directory.Deleteメソッドがあります。このメソッドの挙動で戸惑った点があったのでメモ代わりに書き残します。

やりたかったこと

まず第一にやりたかったことは、「ディレクトリ内のファイルをすべて削除する」ということです。ここで私は面倒くさいので「ディレクトリごと消して、そのあとディレクトリを作成する」とすればいいのではと思いました。

そこで「削除してから作成」というコードを書きました。以下のような感じです。

Directory.Delete(directoryName, true);
Directory.CreateDirectory(directoryName);

結果

ディレクトリは削除されていて、再作成されていない状態になることがありました。

原因

どうもいろいろと調べてみると、削除のメソッドが非同期っぽく振る舞っているようです。つまり削除メソッドが正常に完了しても、ディレクトリの削除が正常に完了していない場合があるようです。時間差で削除が完了することになります。

Directory.Delete メソッド – MSDN

上のURLを確認しても原因となるような記述はありませんが、現実としては非同期っぽく挙動します。

確認用のコード

var directoryName = @"C:\work\foo";

// ディレクトリごと削除
Directory.Delete(directoryName, true);

// ディレクトリ
if (Directory.Exists(directoryName))
{
    Console.WriteLine("削除したのに存在しています ...");
}
else
{
    Console.WriteLine("削除されています ...");
}

// ちょっと待ってから確認
Console.WriteLine("ちょっと待ちます ...");
Thread.Sleep(1000);
if (Directory.Exists(directoryName))
{
    Console.WriteLine("まだ存在しています ...");
}
else
{
    Console.WriteLine("もう削除されています ...");
}

でかいサイズのファイルが存在していたりする場合など、結構な頻度で動作結果は以下のようになります。

削除したのに存在しています ...
ちょっと待ちます ...
もう削除されています ...

削除したのに削除されておらず、時間差で削除が完了していることがわかります。

結論から言うと、非同期っぽく挙動するので気を付けましょうということです。何かしらの対応をする場合は、上のように待機するくらいでしょうか。

以上。

C#カテゴリの最新記事