[ C# ] Directory.Delete がフォルダ削除完了前に制御を戻すことがある

Pocket

Directory.Delete メソッドがフォルダの削除完了前に制御を戻すことがあるようです。ここでは、サンプルコードを使用して内容を確認しています。ここでは、C# で動作確認を行っていますが VB.NET でも同じことが言えるでしょう。

スポンサーリンク

Directory.Delete が非同期メソッドのような振る舞いをする

フォルダ削除とフォルダの作成を繰り返すサンプルコードになります。

// ディレクトリの存在確認
if (Directory.Exists(dirName))
{
   // サブディレクトリ含め削除
   Directory.Delete(dirName, true);
}

// True がリターンされることがある
bool exists = Directory.Exists(dirName); 

// ディレクトリの作成 
// 既に存在すると判定される場合は、この位置で例外が発生してしまう 
Directory.CreateDirectory(dirName); 

Directory.Exists メソッドは Directory.Delete メソッドの復帰直後ではなく、時間差で False を返すことがあるようです。例えば以下のようにディレクトリの削除確認を行えば、期待通りの動作となるはずです。無限ループ仕様ですので気になる人は気になるとは思いますが。。。

// ディレクトリの存在確認
if (Directory.Exists(dirName))
{
   // サブディレクトリ含め削除
   Directory.Delete(dirName, true);
}
bool exists = false;
do {
    // 私 待つわ 待つわ いつまでも待つわ
    exists = Directory.Exists(dirName);
} while (exists);

バグ?仕様?

バグであるか仕様であるかはわかりませんが MSDN の中にはこのような記述があります。

In some cases, if you have the specified directory open in File Explorer, the Delete method may not be able to delete it.

『 エクスプローラで見ていると消えないこともあるかも 』 と言うことのようです。エクスプローラでは、削除されたはずのフォルダがいつまでも表示されていたりすることがありますが関係あるのかもしれません。

要するに、他のアプリケーションが同じフォルダを掴んで離さないために発生することのようです。よって、益々サンプルで示した無限ループウェイトでは心配になります。

結論

フォルダの削除と作成を連続で行う処理はしない

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *