私は .NET 3.5 を使用しており、次を使用してディレクトリを再帰的に削除しようとしています:
Directory.Delete(myPath, true);
私の理解では、ファイルが使用中の場合やアクセス許可の問題がある場合にはエラーが発生しますが、それ以外の場合はディレクトリとその内容がすべて削除されるはずです。
しかし、時々次のようなことが起こります:
System.IO.IOException: The directory is not empty.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.Directory.DeleteHelper(String fullPath, String userPath, Boolean recursive)
at System.IO.Directory.Delete(String fullPath, String userPath, Boolean recursive)
...
メソッドが時々スローするのは驚きではありませんが、recursive が true のときにこの特定のメッセージを受け取るのは驚きです。(ディレクトリが空ではないことはわかっています。)
AccessViolationException の代わりにこれが表示される理由はありますか?
ベストアンサー1
編集者注:この回答には役立つ情報が含まれていますが、 の仕組みについては事実誤認がありますDirectory.Delete
。この回答のコメントと、この質問に対する他の回答をお読みください。
以前この問題に遭遇したことがあります。
問題の根本は、この関数がディレクトリ構造内にあるファイルを削除しないことです。したがって、ディレクトリ構造内のすべてのファイルを削除し、次にすべてのディレクトリを削除してから、ディレクトリ自体を削除する関数を作成する必要があります。これは 2 番目のパラメータに反することは承知していますが、はるかに安全なアプローチです。さらに、ファイルを削除する直前に、読み取り専用アクセス属性をファイルから削除することをお勧めします。そうしないと、例外が発生します。
このコードをプロジェクトに挿入するだけです。
public static void DeleteDirectory(string target_dir)
{
string[] files = Directory.GetFiles(target_dir);
string[] dirs = Directory.GetDirectories(target_dir);
foreach (string file in files)
{
File.SetAttributes(file, FileAttributes.Normal);
File.Delete(file);
}
foreach (string dir in dirs)
{
DeleteDirectory(dir);
}
Directory.Delete(target_dir, false);
}
C:\WINDOWS (%WinDir%)
また、私個人としては、誰かがまたはでこの関数を呼び出すことを望まないので、削除が許可されるマシンの領域に制限を追加しますC:\
。