C#フォルダを確実に削除する

スポンサーリンク

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

関連するリファレンス

準備中です。

スポンサーリンク