ここでは、ファイルをコピー、移動(名前の変更)、削除する方法を紹介します。
なおフォルダ(ディレクトリ)を移動、削除する方法は「フォルダを作成、削除、移動(名前の変更)する」で、コピーする方法は「フォルダをコピーする」で説明しています。
System.IO名前空間のFileクラスを使用すると、ファイルのコピーはCopyメソッド、移動(名前の変更)はMoveメソッド、削除はDeleteメソッドを使って簡単にできます。
以下に例を示します。メソッドの注意事項や、スローする代表的な例外の説明は、コメントに記述しました。
'///////////////////////////////////////////////////////////// ' ファイルをコピーする '///////////////////////////////////////////////////////////// '"C:\test\1.txt"を"C:\test\2.txt"にコピーする 'コピーするファイルが存在しない時は、FileNotFoundExceptionが発生 'コピー先のフォルダが存在しない時は、DirectoryNotFoundExceptionが発生 'コピー先のファイルがすでに存在している時などで、IOExceptionが発生 'コピー先のファイルへのアクセスが拒否された時などで、 ' UnauthorizedAccessExceptionが発生 System.IO.File.Copy("C:\test\1.txt", "C:\test\2.txt") '第3項にTrueを指定すると、コピー先が存在している時、上書きする '上書きするファイルが読み取り専用などで上書きできない場合は、 ' UnauthorizedAccessExceptionが発生 System.IO.File.Copy("C:\test\1.txt", "C:\test\2.txt", True) '///////////////////////////////////////////////////////////// ' ファイルを移動する '///////////////////////////////////////////////////////////// '"C:\test\1.txt"を"C:\test\3.txt"に移動する '別のドライブ(ディスクボリューム)への移動も可能 '移動元と移動先が同じでも、例外は発生しない '移動元のファイルが存在しない時は、FileNotFoundExceptionが発生 '移動先のフォルダが存在しない時は、DirectoryNotFoundExceptionが発生 '移動先のファイルがすでに存在している時などで、例外IOExceptionが発生 '移動先のファイルへのアクセスが拒否された時などで、 ' UnauthorizedAccessExceptionが発生 System.IO.File.Move("C:\test\1.txt", "C:\test\3.txt") '///////////////////////////////////////////////////////////// ' ファイルを削除する '///////////////////////////////////////////////////////////// '"C:\test\3.txt"を削除する '指定したファイルが存在しなくても例外は発生しない '読み取り専用ファイルだと、例外UnauthorizedAccessExceptionが発生 System.IO.File.Delete("C:\test\3.txt")
////////////////////////////////////////////////////////////// // ファイルをコピーする ////////////////////////////////////////////////////////////// //"C:\test\1.txt"を"C:\test\2.txt"にコピーする //コピーするファイルが存在しない時は、FileNotFoundExceptionが発生 //コピー先のフォルダが存在しない時は、DirectoryNotFoundExceptionが発生 //コピー先のファイルがすでに存在している時などで、IOExceptionが発生 //コピー先のファイルへのアクセスが拒否された時などで、 // UnauthorizedAccessExceptionが発生 System.IO.File.Copy(@"C:\test\1.txt", @"C:\test\2.txt"); //第3項にTrueを指定すると、コピー先が存在している時、上書きする //上書きするファイルが読み取り専用などで上書きできない場合は、 // UnauthorizedAccessExceptionが発生 System.IO.File.Copy(@"C:\test\1.txt", @"C:\test\2.txt", true); ////////////////////////////////////////////////////////////// // ファイルを移動する ////////////////////////////////////////////////////////////// //"C:\test\1.txt"を"C:\test\3.txt"に移動する //別のドライブ(ディスクボリューム)への移動も可能 //移動元と移動先が同じでも、例外は発生しない //移動元のファイルが存在しない時は、FileNotFoundExceptionが発生 //移動先のフォルダが存在しない時は、DirectoryNotFoundExceptionが発生 //移動先のファイルがすでに存在している時などで、例外IOExceptionが発生 //移動先のファイルへのアクセスが拒否された時などで、 // UnauthorizedAccessExceptionが発生 System.IO.File.Move(@"C:\test\1.txt", @"C:\test\3.txt"); ////////////////////////////////////////////////////////////// // ファイルを削除する ////////////////////////////////////////////////////////////// //"C:\test\3.txt"を削除する //指定したファイルが存在しなくても例外は発生しない //読み取り専用ファイルだと、例外UnauthorizedAccessExceptionが発生 System.IO.File.Delete(@"C:\test\3.txt");
これらのメソッドについて、何点か補足します。
File.Moveメソッドで別のドライブにファイルを移動する時、移動元のファイルが使用中であると、移動先にコピーはされますが、元のファイルは削除されません。
File.Moveメソッドは、File.Copyメソッドと違い、すでに存在しているファイルを上書きして移動する方法が用意されていません。移動先のファイルを上書きするには、移動先のファイルをFile.Deleteメソッドで削除してから移動するか、後述するFileSystem.MoveFileメソッドを使ってファイルを移動します。
FileInfoクラスでもFileクラスと同じことができます。FileInfoクラスの場合は、ファイルのコピーはCopyToメソッド、移動(名前の変更)はMoveToメソッド、削除はDeleteメソッドでできます。
Fileクラスとの違いは、FileInfoのメソッドがインスタンスメソッドということ位で、その他の違いはほとんどありません(詳しくは、後述します)。
'FileInfoオブジェクトを作成する Dim fi As New System.IO.FileInfo("C:\test\1.txt") '"C:\test\1.txt"を"C:\test\2.txt"にコピーする 'copyFileには、コピー先のファイルを表すFileInfoオブジェクトが入る Dim copyFile As System.IO.FileInfo = fi.CopyTo("C:\test\2.txt") '"C:\test\1.txt"を"C:\test\3.txt"に移動する 'fiは、移動先のファイルを表すFileInfoに変わる fi.MoveTo("C:\test\3.txt") '"C:\test\3.txt"を削除する fi.Delete() '"C:\test\2.txt"を削除する copyFile.Delete()
//FileInfoオブジェクトを作成する System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\test\1.txt"); //"C:\test\1.txt"を"C:\test\2.txt"にコピーする //copyFileには、コピー先のファイルを表すFileInfoオブジェクトが入る System.IO.FileInfo copyFile = fi.CopyTo(@"C:\test\2.txt"); //"C:\test\1.txt"を"C:\test\3.txt"に移動する //fiは、移動先のファイルを表すFileInfoに変わる fi.MoveTo(@"C:\test\3.txt"); //"C:\test\3.txt"を削除する fi.Delete(); //"C:\test\2.txt"を削除する copyFile.Delete();
上記で紹介したFileクラスとFileInfoクラスのメソッドは、Fileクラスのメソッドが静的メソッドで、FileInfoクラスのメソッドがインスタンスメソッドであること以外は、ほぼ同じです。
FileInfo.CopyToメソッドは、コピー先のファイルのFileInfoオブジェクトを返します。また、FileInfo.MoveToメソッドを呼び出すと、そのFileInfoオブジェクトの内容は、移動先のファイルのものに変わります。
FileInfoクラスは、FileInfoコンストラクタで指定されたパスを正規化します(詳しくは、「パス内の"."や".."を削除して、正規化する」)。そのため、その後FileInfoのメソッドが呼び出された時には正規化を行いません。一方Fileのメソッドは、呼び出される度にパスの正規化を行います。
以上の理由により、1度だけファイルをコピー、移動、削除するのであれば、Fileクラスの方が効率的ですが、1つのファイルに対して何度もコピー、移動、削除等を行うのであれば、FileInfoクラスの方が効率的になる可能性があります。
.NET Framework 2.0以降のVB.NETでは、My.Computer.FileSystemオブジェクトを使用してファイルのコピー、移動、削除などができます。C#でも「Microsoft.VisualBasic.dll」を参照設定に追加すれば、FileSystemクラスを使って、同じことができます。
FileSystemの各メソッドは、対応するFileクラスのメソッドと同じように使用することができますが、それ以上の機能もあります。例えば、エクスプローラで大きなファイルをコピーした時のように、ダイアログを表示してコピーの進行状況を表示し、途中でユーザーがキャンセルできるような機能があります。また、ファイルを削除する時、ファイルをごみ箱に移す機能もあります。
FileSystemクラスのメソッドと、それに対応するFileクラスのメソッドを表にすると、以下のようになります。
FileSystemクラスのメソッド | 対応するFileクラスのメソッド | Fileクラスのメソッドとの違い |
---|---|---|
CopyFile (UIOptionを指定しない) | Copy | ファイルのコピー先にフォルダが存在しなくても例外を発生させずに、フォルダが自動的に作成される。 |
CopyFile (UIOptionを指定する) | Copy | SHFileOperation関数を使用してファイルをコピーする。 |
RenameFile | Move | ファイル名の変更(同じフォルダへの移動)のみ可。 |
MoveFile (UIOptionを指定しない) | Move | ファイルの移動先にフォルダが存在しなくても例外を発生させずに、フォルダが自動的に作成される。 3番目の引数にTrueを指定することで、移動先にファイルが存在している時に上書きできる。 |
MoveFile (UIOptionを指定する) | Move | SHFileOperation関数を使用してファイルを移動する。 |
DeleteFile (UIOptionを指定しない) | Delete | ほぼなし |
DeleteFile (UIOptionを指定する) | Delete | SHFileOperation関数を使用してファイルを削除する。 |
FileExists | Exists | ほぼなし。 |
GetFileInfo | (なし) | 「New FileInfo」とほぼ同じ。 |
この表のように、FileSystemのメソッドは、引数にUIOption列挙体の値を指定しない場合は、Fileクラスとほぼ同じです。実際内部では、Fileクラスを使用しています。
しかしUIOptionを指定した時は、Fileクラスを使用せず、SHFileOperation関数を使用します。この場合は、Fileクラスと以下のような違いがあります。
以下に、FileSystemを使用した例を示します。
'//////////////////////////////////////////////////////////// ' ファイルをコピーする '//////////////////////////////////////////////////////////// '"C:\test\1.txt"を"C:\test\2.txt"にコピーする My.Computer.FileSystem.CopyFile("C:\test\1.txt", "C:\test\2.txt") '"C:\test\2.txt"がすでに存在している場合は、これを上書きする My.Computer.FileSystem.CopyFile("C:\test\1.txt", "C:\test\2.txt", True) 'エラーの時、ダイアログを表示する My.Computer.FileSystem.CopyFile("C:\test\1.txt", "C:\test\2.txt", _ FileIO.UIOption.OnlyErrorDialogs) '進行状況ダイアログと、エラーダイアログを表示する My.Computer.FileSystem.CopyFile("C:\test\1.txt", "C:\test\2.txt", _ FileIO.UIOption.AllDialogs) '進行状況ダイアログやエラーダイアログでキャンセルされても例外をスローしない 'UICancelOption.DoNothingを指定しないと、例外OperationCanceledExceptionが発生 My.Computer.FileSystem.CopyFile("C:\test\1.txt", "C:\test\2.txt", _ FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing) '//////////////////////////////////////////////////////////// ' ファイルを移動する '//////////////////////////////////////////////////////////// '"C:\test\a.txt"を"C:\test\b.txt"に名前を変更する My.Computer.FileSystem.RenameFile("C:\test\a.txt", "b.txt") '"C:\test\b.txt"を"C:\test\a.txt"に移動する My.Computer.FileSystem.MoveFile("C:\test\b.txt", "C:\test\a.txt") '"C:\test\b.txt"がすでに存在している場合は、上書きする My.Computer.FileSystem.MoveFile("C:\test\a.txt", "C:\test\b.txt", True) 'エラーの時、ダイアログを表示する My.Computer.FileSystem.MoveFile("C:\test\b.txt", "C:\test\a.txt", _ FileIO.UIOption.AllDialogs) '進行状況ダイアログと、エラーダイアログを表示する My.Computer.FileSystem.MoveFile("C:\test\a.txt", "C:\test\b.txt", _ FileIO.UIOption.AllDialogs) '進行状況ダイアログやエラーダイアログでキャンセルされても例外をスローしない 'UICancelOption.DoNothingを指定しないと、例外OperationCanceledExceptionがスロー My.Computer.FileSystem.MoveFile("C:\test\b.txt", "C:\test\a.txt", _ FileIO.UIOption.AllDialogs, FileIO.UICancelOption.DoNothing) '//////////////////////////////////////////////////////////// ' ファイルを削除する '//////////////////////////////////////////////////////////// '"C:\test\1.txt"を削除する My.Computer.FileSystem.DeleteFile("C:\test\1.txt") '"C:\test\1.txt"を削除し、ごみ箱に入れる 'エラーダイアログのみ表示する My.Computer.FileSystem.DeleteFile("C:\test\1.txt", _ FileIO.UIOption.OnlyErrorDialogs, FileIO.RecycleOption.SendToRecycleBin) '"C:\test\1.txt"を削除する(ごみ箱には入れない) 'エラーダイアログと進行状況ダイアログを表示する 'ユーザーがキャンセルしてもOperationCanceledExceptionをスローしない My.Computer.FileSystem.DeleteFile("C:\test\1.txt", _ FileIO.UIOption.AllDialogs, FileIO.RecycleOption.DeletePermanently, _ FileIO.UICancelOption.DoNothing)
//参照設定に"Microsoft.VisualBasic.dll"が追加されている必要がある //using Microsoft.VisualBasic.FileIO; ////////////////////////////////////////////////////////////// // ファイルをコピーする ////////////////////////////////////////////////////////////// //"C:\test\1.txt"を"C:\test\2.txt"にコピーする FileSystem.CopyFile(@"C:\test\1.txt", @"C:\test\2.txt"); //"C:\test\2.txt"がすでに存在している場合は、これを上書きする FileSystem.CopyFile(@"C:\test\1.txt", @"C:\test\2.txt", true); //エラーの時、ダイアログを表示する FileSystem.CopyFile(@"C:\test\1.txt", @"C:\test\2.txt", UIOption.OnlyErrorDialogs); //進行状況ダイアログと、エラーダイアログを表示する FileSystem.CopyFile(@"C:\test\1.txt", @"C:\test\2.txt", UIOption.AllDialogs); //進行状況ダイアログやエラーダイアログでキャンセルされても例外をスローしない //UICancelOption.DoNothingを指定しないと、例外OperationCanceledExceptionが発生 FileSystem.CopyFile(@"C:\test\1.txt", @"C:\test\2.txt", UIOption.AllDialogs, UICancelOption.DoNothing); ////////////////////////////////////////////////////////////// // ファイルを移動する ////////////////////////////////////////////////////////////// //"C:\test\a.txt"を"C:\test\b.txt"に名前を変更する FileSystem.RenameFile(@"C:\test\a.txt", "b.txt"); //"C:\test\b.txt"を"C:\test\a.txt"に移動する FileSystem.MoveFile(@"C:\test\b.txt", @"C:\test\a.txt"); //"C:\test\b.txt"がすでに存在している場合は、上書きする FileSystem.MoveFile(@"C:\test\a.txt", @"C:\test\b.txt", true); //エラーの時、ダイアログを表示する FileSystem.MoveFile(@"C:\test\b.txt", @"C:\test\a.txt", UIOption.AllDialogs); //進行状況ダイアログと、エラーダイアログを表示する FileSystem.MoveFile(@"C:\test\a.txt", @"C:\test\b.txt", UIOption.AllDialogs); //進行状況ダイアログやエラーダイアログでキャンセルされても例外をスローしない //UICancelOption.DoNothingを指定しないと、例外OperationCanceledExceptionがスロー FileSystem.MoveFile(@"C:\test\b.txt", @"C:\test\a.txt", UIOption.AllDialogs, UICancelOption.DoNothing); ////////////////////////////////////////////////////////////// // ファイルを削除する ////////////////////////////////////////////////////////////// //"C:\test\1.txt"を削除する FileSystem.DeleteFile(@"C:\test\1.txt"); //"C:\test\1.txt"を削除し、ごみ箱に入れる //エラーダイアログのみ表示する FileSystem.DeleteFile(@"C:\test\1.txt", UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); //"C:\test\1.txt"を削除する(ごみ箱には入れない) //エラーダイアログと進行状況ダイアログを表示する //ユーザーがキャンセルしてもOperationCanceledExceptionをスローしない FileSystem.DeleteFile(@"C:\test\1.txt", UIOption.AllDialogs, RecycleOption.DeletePermanently, UICancelOption.DoNothing);
.NET Framework 2.0からは、File.Replaceメソッド(あるいは、FileInfo.Replaceメソッド)により、ファイルの置換(置き換え)ができます。
ファイルの置換とは、例えば「1.txt」と「2.txt」という2つのファイルがあった時、「2.txt」の内容を「1.txt」の内容で置き換えるということです。この時、「1.txt」はなくなりますが、「2.txt」は別のファイルにバックアップすることができます。
つまりこのメソッドは、「2.txt」をバックアップファイルに移動してから、「1.txt」を「2.txt」に移動するのとほとんど同じことをします。しかし、作成日時や暗号化、圧縮など一部の属性は、「2.txt」のものが引き継がれます。また、この操作はアトミックです。詳しくは、「ReplaceFile関数」をご覧ください。
このメソッドは、「1.txt」と「2.txt」の両方が存在していないと失敗します。また、「1.txt」と「2.txt」とバックアップファイルはすべて同じボリューム上にある必要があります。
'ファイルを置き換えて、バックアップを作成する
'"test1.txt"が"test2.txt"になり、"test2.txt"が"test3.txt"になる
'"test1.txt"、"test2.txt"共に存在している必要がある
'"test3.txt"が存在していると上書きされる
System.IO.File.Replace("C:\test1.txt", "C:\test2.txt", "C:\test3.txt")
//ファイルを置き換えて、バックアップを作成する
//"test1.txt"が"test2.txt"になり、"test2.txt"が"test3.txt"になる
//"test1.txt"、"test2.txt"共に存在している必要がある
//"test3.txt"が存在していると上書きされる
System.IO.File.Replace("C:\\test1.txt", "C:\\test2.txt", "C:\\test3.txt");
この章の内容は、「ファイルの属性を取得、設定する」に移しました。
この章の内容は、「ファイルのタイムスタンプ(作成日時、更新日時、アクセス日時)を取得、設定する」に移しました。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。