[ VB.NET / C# ] ディレクトリの削除を行う ( DirectoryInfo.Delete )

Pocket

ここでは、VB.NET または C# で DirectoryInfo.Delete メソッドを使用して、ディレクトリの削除を行うサンプルコードを掲載しています。

スポンサーリンク

DirectoryInfo.Delete メソッドをパラメータなしで呼び出した場合には、ディレクトリ内にファイルやサブフォルダが存在すると System.IO.IOException 例外が発生します。まずは、ディレクトリ内のファイルやサブディレクトリを先に削除するか、DirectoryInfo.Delete メソッドの第1パラメータに True を設定します。

VB.NET

    Dim delDir As System.IO.DirectoryInfo = New System.IO.DirectoryInfo("E:\del")

    ' ディレクトリの削除
    delDir.Delete()

    ' ディレクトリ内にファイルやディレクトリが存在すると、以下の例外が発生する
    '--------------------------------------------------------------------------
    ' System.IO.IOException ディレクトリが空ではありません。 

    ' サブディレクトリも含めて削除する場合は、パラメータに True を設定する
    'delDir.Delete(True)

C#

    System.IO.DirectoryInfo delDir = new System.IO.DirectoryInfo(@"E:\del");

    // ディレクトリの削除
    delDir.Delete();

    // ディレクトリ内にファイルやディレクトリが存在すると、以下の例外が発生する
    //--------------------------------------------------------------------------
    // System.IO.IOException ディレクトリが空ではありません。 

    // サブディレクトリも含めて削除する場合は、パラメータに true を設定する
    //delDir.Delete(true);
ファイルやディレクトリが読み取り専用の場合

削除するディレクトリ内のファイルやサブディレクトリに読み取り専用のものがある場合、 System.UnauthorizedAccessExceptionSystem.IO.IOException 例外が発生してしまい、ディレクトリの削除に失敗します。読み取り専用のファイルやディレクトリが存在する場合は、読み取り専用属性を外してから削除する必要があります。

VB.NET

    ' ディレクトリの削除
    Dim delDir As System.IO.DirectoryInfo = New System.IO.DirectoryInfo("E:\del")
    DeleteReadOnlyDirectory(delDir)

    ' 読み取り専用属性を外してディレクトリを削除する
    Public Sub DeleteReadOnlyDirectory(ByVal dirInfo As System.IO.DirectoryInfo)

        ' ディレクトリ内のファイル一覧を取得し、読み取り専用属性を外す
        For Each fileInfo As System.IO.FileInfo In dirInfo.GetFiles()
            If (fileInfo.Attributes And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly Then
                fileInfo.Attributes = System.IO.FileAttributes.Normal
            End If
        Next

        ' サブディレクトリの一覧を取得し、再帰的に自メソッドを呼び出す
        For Each subDirInfo As System.IO.DirectoryInfo In dirInfo.GetDirectories()
            DeleteReadOnlyDirectory(subDirInfo)
        Next

        ' このディレクトリの読み取り専用属性を外す
        If (dirInfo.Attributes And System.IO.FileAttributes.ReadOnly) = System.IO.FileAttributes.ReadOnly Then
            dirInfo.Attributes = System.IO.FileAttributes.Directory
        End If

        ' このディレクトリを削除する(サブディレクトリも含めて削除)
        dirInfo.Delete(True)

    End Sub

C#

    // ディレクトリの削除
    System.IO.DirectoryInfo delDir = new System.IO.DirectoryInfo(@"E:\del");
    DeleteReadOnlyDirectory(delDir);

    public void DeleteReadOnlyDirectory(System.IO.DirectoryInfo dirInfo)
    {
        //  ディレクトリ内のファイル一覧を取得し、読み取り専用属性を外す
        foreach (System.IO.FileInfo fileInfo in dirInfo.GetFiles()) {
            if ((fileInfo.Attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) {
                fileInfo.Attributes = System.IO.FileAttributes.Normal;
            }
        }

        // サブディレクトリの一覧を取得し、再帰的に自メソッドを呼び出す
        foreach (System.IO.DirectoryInfo subDirInfo in dirInfo.GetDirectories()) {
            DeleteReadOnlyDirectory(subDirInfo);
        }

        // このディレクトリの読み取り専用属性を外す
        if ((dirInfo.Attributes & System.IO.FileAttributes.ReadOnly) == System.IO.FileAttributes.ReadOnly) {
            dirInfo.Attributes = System.IO.FileAttributes.Directory;
        }

        // このディレクトリを削除する(サブディレクトリも含めて削除)
        dirInfo.Delete(true);
    }
.Net Framewrok 4 以降の場合

.Net Framework 4 以降であれば読み取り専用ファイル・サブディレクトリを含むディレクトリの削除を行う場合には、 DirectoryInfo.GetFileSystemInfos を使用することもできます。

VB.NET

    ' 削除ディレクトリ情報を取得
    Dim delDir As System.IO.DirectoryInfo = New System.IO.DirectoryInfo("E:\del")

    ' サブディレクトリ内も含めすべてのファイルを取得する
    Dim fileInfos() As System.IO.FileSystemInfo =
        delDir.GetFileSystemInfos("*", System.IO.SearchOption.AllDirectories)

    ' ファイル属性から読み取り専用属性を外す
    For Each fileInfo As System.IO.FileSystemInfo In fileInfos

        ' ディレクトリまたはファイルであるかを判断する
        If ((fileInfo.Attributes And System.IO.FileAttributes.Directory) = System.IO.FileAttributes.Directory) Then
            ' ディレクトリの場合
            fileInfo.Attributes = System.IO.FileAttributes.Directory
        Else
            ' ファイルの場合
            fileInfo.Attributes = System.IO.FileAttributes.Normal
        End If
    Next

    ' ディレクトリを削除(サブディレクトリを含む)
    delDir.Delete(True)

C#

    // 削除ディレクトリ情報を取得
    System.IO.DirectoryInfo delDir = new System.IO.DirectoryInfo(@"E:\del");

    // サブディレクトリ内も含めすべてのファイルを取得する
    System.IO.FileSystemInfo[] fileInfos = delDir.GetFileSystemInfos("*", System.IO.SearchOption.AllDirectories);

    // ファイル属性から読み取り専用属性を外す
    foreach(System.IO.FileSystemInfo fileInfo in fileInfos) {

        // ディレクトリまたはファイルであるかを判断する
        if ((fileInfo.Attributes & System.IO.FileAttributes.Directory) == System.IO.FileAttributes.Directory) {
            // ディレクトリの場合
            fileInfo.Attributes = System.IO.FileAttributes.Directory;
        } else {
            // ファイルの場合
            fileInfo.Attributes = System.IO.FileAttributes.Normal;
        }
    }

    // ディレクトリを削除(サブディレクトリを含む)
    delDir.Delete(true);
参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *