ここでは、フォルダ(ディレクトリ)を作成、削除、移動(名前の変更)する方法を紹介します。
なおフォルダをコピーする方法は、「フォルダをコピーする」で説明しています。また、ファイルをコピー、移動、削除する方法は、「ファイルをコピー、移動(名前の変更)、削除する」で説明しています。
System.IO名前空間のDirectoryクラスを使用すると、フォルダの作成はCreateDirectoryメソッドで、削除はDeleteメソッドで、移動(フォルダ名を変更)はMoveメソッドで簡単にできます。
以下に例を示します。メソッドの注意事項や、スローする代表的な例外の説明は、コメントに記述しています。
'フォルダ"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:\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クラスを使用しても、Directoryクラスと全く同じことができます。Directoryクラスとの違いは、静的メソッドかインスタンスメソッドかの違いくらいです。
'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)
//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クラスのメソッドは、静的メソッドかインスタンスメソッドかという違い以外は、ほとんど同じです。
DirectoryInfoクラスを使用するにはインスタンスを作成する必要があるため、1回だけフォルダの操作をするならば、Directoryクラスを使用した方が効率的です。ただし、Directoryクラスはメソッドが呼び出される度に指定されたパスを正規化(詳しくは、「パス内の"."や".."を削除して、正規化するる」)しますが、DirectoryInfoクラスはコンストラクタで指定されたパスはコンストラクタで正規化し、その後呼び出されたメソッドではそれを使用しますので、1つのフォルダに対して複数の操作を行うならば、DirectoryInfoクラスの方が効率的になる可能性があります。
.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を使用した例を示します。
'フォルダ"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)
//参照設定に"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メソッドを使用した例は、上記コードをご覧ください。
この章の内容は、「フォルダのタイムスタンプ(作成日時、更新日時、アクセス日時)を取得、設定する」に移しました。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。