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