フォルダを確実に削除する
スポンサーリンク
System.IO.Directory.Delete メソッドを実行したフォルダの配下に、読み取り専用ファイルが存在すると例外が発生します。これは、削除する前に読み取り専用属性を外すことで解決します。
以下は、その処理を関数化したものです。読み取り専用属性だった場合でも削除したり、または削除をキャンセルする (例外は発生しない) ことができます。引数には、対象ディレクトリのパスと、DirectoryInfo と、どちらでも指定できるようにオーバーロードしています。
サンプルコード
以下にサンプルコードを示します。
C# 全般
/// ---------------------------------------------------------------------------- /// <summary> /// 指定したディレクトリをすべて削除します。</summary> /// <param name="stDirPath"> /// 削除するディレクトリのパス。</param> /// ---------------------------------------------------------------------------- public static void DeleteDirectory(string stDirPath) { DeleteDirectory(new System.IO.DirectoryInfo(stDirPath)); } /// ---------------------------------------------------------------------------- /// <summary> /// 指定したディレクトリをすべて削除します。</summary> /// <param name="hDirectoryInfo"> /// 削除するディレクトリの DirectoryInfo。</param> /// ---------------------------------------------------------------------------- public static void DeleteDirectory(System.IO.DirectoryInfo hDirectoryInfo) { // すべてのファイルの読み取り専用属性を解除する foreach (System.IO.FileInfo cFileInfo in hDirectoryInfo.GetFiles()) { if ((cFileInfo.Attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) { cFileInfo.Attributes = System.IO.FileAttributes.Normal; } } // サブディレクトリ内の読み取り専用属性を解除する (再帰) foreach (System.IO.DirectoryInfo hDirInfo in hDirectoryInfo.GetDirectories()) { DeleteDirectory(hDirInfo); } // このディレクトリの読み取り専用属性を解除する if ((hDirectoryInfo.Attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) { hDirectoryInfo.Attributes = System.IO.FileAttributes.Directory; } // このディレクトリを削除する hDirectoryInfo.Delete(true); }
使用例は以下のようになります。
C# 全般
// フォルダをすべて削除する
DeleteDirectory(@"C:\Hoge\");
関連するリファレンス
準備中です。