J#(Java)フォルダを確実に削除する

スポンサーリンク

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\\");

関連するリファレンス

準備中です。

スポンサーリンク