ディレクトリ(フォルダー)を削除する [C#]

C#でディレクトリ(フォルダー)を削除する方法について紹介します。
ディレクトリの削除には、System.IO名前空間のDirectoryInfoクラスのDeleteメソッドを使用するか、DirectoryクラスのDelete静的メソッドを使用します。

DirectoryInfoクラスのDeleteメソッドで削除

DirectoryInfoクラスのDeleteメソッドの構文は次のようになります。

引数を取らないメソッドは空のディレクトリを削除するときに使用します。
引数にbool型のrecursiveを取るメソッドは、ディレクトリの中に含まれるサブディレクトリとファイルを合わせて削除するかどうかを指定して使用します。trueを指定するとサブディレクトリとファイルを削除します。falseを指定すると引数を指定しないDeleteメソッドと同様にディレクトリが空の場合に削除します。

DirectoryInfo.Deleteメソッドの使用例

以下にDeleteメソッドの使用例を示します。

引数を指定しない場合

上記の例では以下の記事「ディレクトリ(フォルダー)を作成する」で作成するディレクトリのC:\Test\NewDirディレクトリを削除しています。

ディレクトリ(フォルダー)を作成する [C#]
C#でディレクトリ(フォルダー)を作成する方法について紹介します。 ディレクトリを作成する際は、System.IO名前空間のDirecto...
引数のrecursiveを指定する場合

サブディレクトリファイルを含めて削除する場合は引数にtrueを指定します。

DirectoryInfoクラスの引数を指定しないDeleteメソッド、または引数recursiveにfalseを指定したDeleteメソッドの実行時に、空でないディレクトリを削除しようとすると「System.IO.IOException: ‘ディレクトリが空ではありません。’」という例外が発生します。

DirectoryクラスのDelete静的メソッドで削除

DirectoryクラスのDelete静的メソッドの構文は次のようになります。

DirectoryクラスのDelete静的メソッドもDirectoryInfoクラスのDeleteメソッドと同じように使用します。
引数のpathには削除するディレクトリのパスを指定します。
bool型の引数recursiveにはディレクトリの中に含まれるサブディレクトリとファイルを合わせて削除するかどうかを指定します。

Directory.Delete静的メソッドの使用例

以下にDelete静的メソッドの使用例を示します。

引数のrecursiveを指定しない場合

引数のrecursiveを指定する場合

DirectoryクラスのDelete静的メソッドも引数recursiveを指定しない場合、および引数recursiveにfalseを指定した場合に削除対象のディレクトリが空でなければ例外(System.IO.IOException)が発生します。

DirectoryInfoクラスのDeleteメソッド、DirectoryクラスのDelete静的メソッドともに、ディレクトリ以下のサブディレクトリ、ファイルの中に読み取り専用属性が設定されているものがあると「System.UnauthorizedAccessException: パス ‘○○○○○’ へのアクセスが拒否されました。」という例外が発生してしまいます。
これを回避するためには削除するディレクトリとディレクトリ内のすべてのサブディレクトリ、およびファイルの読み取り専用属性を変更する必要があります。
以下に読み取り専用を変更するコードの例を示します。

上記のメソッドではディレクトリとファイルの属性を参照して、読み取り専用属性がある場合に通常(特別な属性を持たない標準ファイル)に変更しています。このメソッドをディレクトリを削除する処理の前に呼び出してやることで、読み取り専用属性のディレクトリまたはファイルが含まれていてもディレクトリを削除することができます。

サンプルプログラム

Windowsフォームアプリケーションでのプログラムの実装例を記載します。

ユーザーインターフェース

フォームのインターフェースは次のようにします。

ディレクトリ削除サンプルフォームデザイン

ソースコード

サンプルプログラムのフォームには次のようなソースコードを記述します。

サンプルの実行

作成したプログラムを実行します。

ディレクトリ削除サンプルフォーム

[button1]がDirectoryInfoクラスのDeleteメソッドの引数を指定しないでディレクトリを削除する処理を実行します。
[button2]がDirectoryInfoクラスのDeleteメソッドの引数にサブディレクトリとファイルを含めて削除するかどうかを指定してディレクトリを削除する処理を実行します。
[button3]がDirectoryクラスのDelete静的メソッドの引数を指定しないでディレクトリを削除する処理を実行します。
[button4]がDirectoryクラスのDelete静的メソッドの引数にサブディレクトリとファイルを含めて削除するかどうかを指定してディレクトリを削除する処理を実行します。

DドライブにWork > DeletionDirectorySample > MyDirの順にディレクトリを作成します。

ディレクトリ削除前サブディレクトリなし

パスのテキストボックスに「D:\Work\DeletionDirectorySample\MyDir」を入力します。

ディレクトリ削除サンプルフォームのパスを入力

[button1]をクリックします。

ディレクトリ削除結果

メッセージが表示され、MyDirディレクトリが削除されます。

ディレクトリ削除結果

DeletionDirectorySampleディレクトリの中にMyDirディレクトリを再度作成し、MyDirディレクトリの中にChildDirディレクトリを作成します。

ディレクトリ削除前サブディレクトリあり

[button1]をクリックします。

ディレクトリ削除結果

サブディレクトリが存在するので例外が発生してメッセージが表示され、MyDirディレクトリが削除されません。

[button2]をクリックします。

ディレクトリ削除結果

[button1]の時と同様に、サブディレクトリが存在するので例外が発生してメッセージが表示され、MyDirディレクトリが削除されません。

サブディレクトリおよびファイルを含めるのチェックボックスをチェックONにします。

ディレクトリ削除サンプルフォームのパスを入力

[button2]をクリックします。

メッセージが表示され、MyDirディレクトリが削除されます。

ディレクトリ削除結果

[button3]と[button4]については、[button1]と[button2]の場合と同じ動作となりますので省略しますが、皆さんはよかったら試してみてください。