DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

フォルダを作成、削除、移動(名前の変更)する

ここでは、フォルダ(ディレクトリ)を作成、削除、移動(名前の変更)する方法を紹介します。

なおフォルダをコピーする方法は、「フォルダをコピーする」で説明しています。また、ファイルをコピー、移動、削除する方法は、「ファイルをコピー、移動(名前の変更)、削除する」で説明しています。

Directoryクラスを使用する方法

System.IO名前空間のDirectoryクラスを使用すると、フォルダの作成はCreateDirectoryメソッドで、削除はDeleteメソッドで、移動(フォルダ名を変更)はMoveメソッドで簡単にできます。

以下に例を示します。メソッドの注意事項や、スローする代表的な例外の説明は、コメントに記述しています。

VB.NET
コードを隠すコードを選択
'フォルダ"C:\TEST\SUB"を作成する
'"C:\TEST"フォルダが存在しなくても"C:\TEST\SUB"が作成される
'"C:\TEST\SUB"が存在していると、IOExceptionが発生
'アクセス許可が無いと、UnauthorizedAccessExceptionが発生
Dim di As System.IO.DirectoryInfo = _
    System.IO.Directory.CreateDirectory("C:\TEST\SUB")

'フォルダ"C:\1"を"C:\2\SUB"に移動(名前を変更)する
'"C:\2\SUB"が存在していると、IOExceptionが発生
'移動先が別のドライブ(ボリューム)だと、IOExceptionが発生
'"C:\1"や"C:\2"が存在しないと、DirectoryNotFoundExceptionが発生
'"C:\1\SUB"のように移動先が移動元のサブフォルダだと、IOExceptionが発生
'アクセス許可が無いと、UnauthorizedAccessExceptionが発生
System.IO.Directory.Move("C:\1", "C:\2\SUB")

'フォルダ"C:\TEST"を削除する
'第2項をTrueにすると、"C:\TEST"を根こそぎ(サブフォルダ、ファイルも)削除する
'"C:\TEST"に読み取り専用ファイルがあると、UnauthorizedAccessExceptionが発生
'"C:\TEST"が存在しないと、DirectoryNotFoundExceptionが発生
System.IO.Directory.Delete("C:\TEST", True)
C#
コードを隠すコードを選択
//フォルダ"C:\TEST\SUB"を作成する
//"C:\TEST"フォルダが存在しなくても"C:\TEST\SUB"が作成される
//"C:\TEST\SUB"が存在していると、IOExceptionが発生
//アクセス許可が無いと、UnauthorizedAccessExceptionが発生
System.IO.DirectoryInfo di =
    System.IO.Directory.CreateDirectory(@"C:\TEST\SUB");

//フォルダ"C:\1"を"C:\2\SUB"に移動(名前を変更)する
//"C:\2\SUB"が存在していると、IOExceptionが発生
//移動先が別のドライブ(ボリューム)だと、IOExceptionが発生
//"C:\1"や"C:\2"が存在しないと、DirectoryNotFoundExceptionが発生
//"C:\1\SUB"のように移動先が移動元のサブフォルダだと、IOExceptionが発生
//アクセス許可が無いと、UnauthorizedAccessExceptionが発生
System.IO.Directory.Move(@"C:\1", @"C:\2\SUB");

//フォルダ"C:\TEST"を削除する
//第2項をTrueにすると、"C:\TEST"を根こそぎ(サブフォルダ、ファイルも)削除する
//"C:\TEST"に読み取り専用ファイルがあると、UnauthorizedAccessExceptionが発生
//"C:\TEST"が存在しないと、DirectoryNotFoundExceptionが発生
System.IO.Directory.Delete(@"C:\TEST", true);

これらのメソッドについて補足します。

Directory.Moveメソッドは、移動というより、名前を変更すると考えた方が良いでしょう。上記の例で言えば、移動先の"C:\2\SUB"にフォルダ"C:\2\SUB\1"が作成される訳ではなく、"C:\1"が"C:\2\SUB"という名前に変わるだけです。そのため、別のドライブ(ボリューム)に移動できないなど、制限がかなり多いです。

Directory.Deleteメソッドは、2番目の引数にTrueを指定しないと、空のフォルダしか削除できません。空でないと、例外IOExceptionが発生します。

またDirectory.Deleteメソッドは、削除するフォルダに読み取り専用ファイルがあると、失敗します。これを回避する方法は、「読み取り専用ファイルがあるときでもフォルダを削除する」で説明しています。

以上のDirectoryクラスのメソッドを表にまとめます。

Directoryのメソッド 説明 注意事項
CreateDirectory ディレクトリを作成する 作成するディレクトリの親ディレクトリが存在しない時は、親ディレクトリも作成される。
Move ディレクトリを移動する 移動というより、名前の変更と考えたほうが良い。
移動先のディレクトリが存在してはいけない。
移動先のディレクトリは移動元のディレクトリと同じドライブ(ボリューム)でなければならない。
移動先のディレクトリが移動元のサブディレクトリであってはならない。
移動先のディレクトリの親ディレクトリは存在していなければならない。
移動後はファイル、ディレクトリの属性が引き継がれる。
Delete ディレクトリを削除する 2番目の引数にTrueを指定しない時は、空のディレクトリしか削除できない。
削除するディレクトリ自身や、その中にあるファイル、サブディレクトリに読み取り専用属性があると、エラーとなる。詳しくは、「読み取り専用ファイルがあるときでもフォルダを削除する」。

DirectoryInfoクラスを使用する方法

DirectoryInfoクラスを使用しても、Directoryクラスと全く同じことができます。Directoryクラスとの違いは、静的メソッドかインスタンスメソッドかの違いくらいです。

VB.NET
コードを隠すコードを選択
'DirectoryInfoオブジェクトを作成する
Dim di As New System.IO.DirectoryInfo("C:\TEST\SUB")

'フォルダ"C:\TEST\SUB"を作成する
di.Create()

'サブフォルダ"1"を作成する
'subDirには、フォルダ"C:\TEST\SUB\1"のDirectoryInfoオブジェクトが入る
Dim subDir As System.IO.DirectoryInfo = di.CreateSubdirectory("1")

'フォルダ"C:\TEST\SUB\1"を"C:\TEST\SUB\2"に移動する
'subDirの内容は、"C:\TEST\SUB\2"のものに変わる
subDir.MoveTo("C:\TEST\SUB\2")

'フォルダ"C:\TEST\SUB"を根こそぎ削除する
di.Delete(True)
C#
コードを隠すコードを選択
//DirectoryInfoオブジェクトを作成する
System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"C:\TEST\SUB");

//フォルダ"C:\TEST\SUB"を作成する
di.Create();

//サブフォルダ"1"を作成する
//subDirには、フォルダ"C:\TEST\SUB\1"のDirectoryInfoオブジェクトが入る
System.IO.DirectoryInfo subDir = di.CreateSubdirectory("1");

//フォルダ"C:\TEST\SUB\1"を"C:\TEST\SUB\2"に移動する
//subDirの内容は、"C:\TEST\SUB\2"のものに変わる
subDir.MoveTo(@"C:\TEST\SUB\2");

//フォルダ"C:\TEST\SUB"を根こそぎ削除する
di.Delete(true);

DirectoryクラスとDirectoryInfoクラスのメソッドの違い

上で紹介したDirectoryクラスとDirectoryInfoクラスのメソッドは、静的メソッドかインスタンスメソッドかという違い以外は、ほとんど同じです。

DirectoryInfoクラスを使用するにはインスタンスを作成する必要があるため、1回だけフォルダの操作をするならば、Directoryクラスを使用した方が効率的です。ただし、Directoryクラスはメソッドが呼び出される度に指定されたパスを正規化(詳しくは、「パス内の"."や".."を削除して、正規化するる」)しますが、DirectoryInfoクラスはコンストラクタで指定されたパスはコンストラクタで正規化し、その後呼び出されたメソッドではそれを使用しますので、1つのフォルダに対して複数の操作を行うならば、DirectoryInfoクラスの方が効率的になる可能性があります。

My.Computer.FileSystemを使用する方法

.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystemを使用することもできます。C#でも「Microsoft.VisualBasic.dll」を参照設定に追加すれば、FileSystemクラスを使って、同じことができます。

FileSystemクラスのメソッドを、それに対応するDirectoryクラスと比較すると、以下のようになります。

FileSystemクラスのメソッド 対応するDirectoryクラスのメソッド Directoryクラスのメソッドとの違い
CreateDirectory CreateDirectory ほぼなし。
RenameDirectory Move フォルダ名の変更(同じフォルダへの移動)のみ可。
MoveDirectory
(UIOptionを指定しない)
Move 移動先のフォルダの親フォルダが存在しなくても例外を発生させずに、フォルダが自動的に作成される。
別のボリュームにも移動できる。
3番目の引数にTrueを指定することで、移動先にファイルが存在している時に上書きできる。
MoveDirectory
(UIOptionを指定する)
Move SHFileOperation関数を使用してフォルダを移動する。
DeleteDirectory
(UIOptionを指定しない)
Delete ほぼなし。
DeleteDirectory
(UIOptionを指定する)
Delete SHFileOperation関数を使用してフォルダを削除する。
CopyDirectory (なし) ディレクトリをコピーする。詳しくは、「フォルダをコピーする」。
GetDirectoryInfo (なし) 「New DirectoryInfo」とほぼ同じ。

この表のように、FileSystemのメソッドの動作は、引数にUIOption列挙体の値を指定するかしないかで大きく変わります。UIOptionを指定しなかった場合の動作はDirectoryクラスと似ており、実際内部ではDirectoryクラスのメソッドが呼び出されています。

これに対してUIOptionを指定した時は、SHFileOperation関数を使用します。そのため、「ファイルをコピー、移動(名前の変更)、削除する」で説明しているように、エクスプローラーでフォルダ操作をした時のような進行状況ダイアログやエラーダイアログを表示したり、途中でユーザーがキャンセルしたり、削除でごみ箱に移したりすることができます。

以下にFileSystemを使用した例を示します。

VB.NET
コードを隠すコードを選択
'フォルダ"C:\test\sub"を作成する
My.Computer.FileSystem.CreateDirectory("C:\test\sub")

'フォルダ"C:\test\1"を"C:\test\2"に移動する
'第3項にTrueを指定すると、"C:\test\2"が存在する時、上書きする
My.Computer.FileSystem.MoveDirectory("C:\test\1", "C:\test\2", True)

'フォルダ"C:\test\1"を"C:\test\2"に移動する
'進行状況ダイアログとエラーダイアログを表示する
'ユーザーがキャンセルしても例外OperationCanceledExceptionをスローしない
My.Computer.FileSystem.MoveDirectory("C:\test\1", "C:\test\2", _
    FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing)

'フォルダ"C:\test\2"を削除して、ごみ箱に入れる
'進行状況ダイアログとエラーダイアログを表示する
'ユーザーがキャンセルしても例外OperationCanceledExceptionをスローしない
My.Computer.FileSystem.DeleteDirectory("C:\test\2", _
    FileIO.UIOption.AllDialogs, FileIO.RecycleOption.SendToRecycleBin, _
    FileIO.UICancelOption.DoNothing)
C#
コードを隠すコードを選択
//参照設定に"Microsoft.VisualBasic.dll"が追加されている必要がある
//using Microsoft.VisualBasic.FileIO;

//フォルダ"C:\test\sub"を作成する
FileSystem.CreateDirectory("C:\\test\\sub");

//フォルダ"C:\test\1"を"C:\test\2"に移動する
//第3項にTrueを指定すると、"C:\test\2"が存在する時、上書きする
FileSystem.MoveDirectory("C:\\test\\1", "C:\\test\\2", true);

//フォルダ"C:\test\1"を"C:\test\2"に移動する
//進行状況ダイアログとエラーダイアログを表示する
//ユーザーがキャンセルしても例外OperationCanceledExceptionをスローしない
FileSystem.MoveDirectory("C:\\test\\1", "C:\\test\\2",
    UIOption.AllDialogs, UICancelOption.DoNothing);

//フォルダ"C:\test\2"を削除して、ごみ箱に入れる
//進行状況ダイアログとエラーダイアログを表示する
//ユーザーがキャンセルしても例外OperationCanceledExceptionをスローしない
FileSystem.DeleteDirectory("C:\\test\\2",
    UIOption.AllDialogs, RecycleOption.SendToRecycleBin,
    UICancelOption.DoNothing);

違うドライブにフォルダを移動させる

Directory.Moveメソッドは、移動先と移動元のフォルダが同じドライブに存在しなければなりません。もし違うドライブにフォルダを移動するのであれば、上記のFileSystem.MoveDirectoryメソッドを使用したり、「フォルダをコピーする」で紹介しているようなやり方で1つ1つのファイルをFile.Moveメソッドで移動する方法が考えられます。

FileSystem.MoveDirectoryメソッドを使用した例は、上記コードをご覧ください。

フォルダのタイムスタンプを取得、設定する

この章の内容は、「フォルダのタイムスタンプ(作成日時、更新日時、アクセス日時)を取得、設定する」に移しました。

  • 履歴:
  • 2006/11/20 表を追加。
  • 2007/2/19 My.Computer.FileSystemを使用する方法を追加。
  • 2010/1/26 誤字を修正。
  • 2010/3/28 DirectoryInfoクラスのコードを追加。説明の追加など。
  • 2010/9/15 フォルダのタイムスタンプを取得、設定する方法を別のページに移した。
  • 2013/6/10 「DirectoryクラスとDirectoryInfoクラスのメソッドの違い」を追加など。
  • 2014/10/27 RenameDirectoryメソッドの説明を修正。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • 「???を参照に追加します」の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。