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

ファイルをコピー、移動(名前の変更)、削除する

ここでは、ファイルをコピー、移動(名前の変更)、削除する方法を紹介します。

なおフォルダ(ディレクトリ)を移動、削除する方法は「フォルダを作成、削除、移動(名前の変更)する」で、コピーする方法は「フォルダをコピーする」で説明しています。

Fileクラスを使用する方法

System.IO名前空間のFileクラスを使用すると、ファイルのコピーはCopyメソッド、移動(名前の変更)はMoveメソッド、削除はDeleteメソッドを使って簡単にできます。

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

VB.NET
コードを隠すコードを選択
'/////////////////////////////////////////////////////////////
' ファイルをコピーする
'/////////////////////////////////////////////////////////////

'"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#
コードを隠すコードを選択
//////////////////////////////////////////////////////////////
// ファイルをコピーする
//////////////////////////////////////////////////////////////

//"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クラスを使用する方法

FileInfoクラスでもFileクラスと同じことができます。FileInfoクラスの場合は、ファイルのコピーはCopyToメソッド、移動(名前の変更)はMoveToメソッド、削除はDeleteメソッドでできます。

Fileクラスとの違いは、FileInfoのメソッドがインスタンスメソッドということ位で、その他の違いはほとんどありません(詳しくは、後述します)。

VB.NET
コードを隠すコードを選択
'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()
C#
コードを隠すコードを選択
//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クラスのメソッドは、Fileクラスのメソッドが静的メソッドで、FileInfoクラスのメソッドがインスタンスメソッドであること以外は、ほぼ同じです。

FileInfo.CopyToメソッドは、コピー先のファイルのFileInfoオブジェクトを返します。また、FileInfo.MoveToメソッドを呼び出すと、そのFileInfoオブジェクトの内容は、移動先のファイルのものに変わります。

FileInfoクラスは、FileInfoコンストラクタで指定されたパスを正規化します(詳しくは、「パス内の"."や".."を削除して、正規化する」)。そのため、その後FileInfoのメソッドが呼び出された時には正規化を行いません。一方Fileのメソッドは、呼び出される度にパスの正規化を行います。

以上の理由により、1度だけファイルをコピー、移動、削除するのであれば、Fileクラスの方が効率的ですが、1つのファイルに対して何度もコピー、移動、削除等を行うのであれば、FileInfoクラスの方が効率的になる可能性があります。

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

.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クラスと以下のような違いがあります。

  • ある種のエラーが発生した時、例外をスローせずにエラーダイアログを表示します。例えば、コピー先のフォルダへのアクセスが拒否された時は、以下のようなダイアログが表示されます。
    エラーダイアログ
  • 引数にUIOption.AllDialogsを指定した時は、エラーダイアログに加えて、進行状況ダイアログ(プログレスダイアログボックス)を表示します。(ただしコピーが短時間で終了した場合は、表示されません。)
  • エラーダイアログや進行状況ダイアログには、キャンセルボタンがあります。これをユーザーがクリックすると、処理をキャンセルすることができます。キャンセルされた場合、例外OperationCanceledExceptionがスローされます。もしキャンセルされても例外がスローされないようにするには、引数にUICancelOption.DoNothingを指定します。
  • コピーや移動先にファイルが存在していると、上書きします。
  • コピーや移動先のフォルダが存在しない時は、自動的に作成されます。
  • 削除するファイルが読み取り専用であっても削除します。
  • ファイルを削除する時にRecycleOption.SendToRecycleBinを指定すると、削除したファイルをごみ箱に入れます。

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

VB.NET
コードを隠すコードを選択
'////////////////////////////////////////////////////////////
' ファイルをコピーする
'////////////////////////////////////////////////////////////

'"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)
C#
コードを隠すコードを選択
//参照設定に"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」とバックアップファイルはすべて同じボリューム上にある必要があります。

VB.NET
コードを隠すコードを選択
'ファイルを置き換えて、バックアップを作成する
'"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")
C#
コードを隠すコードを選択
//ファイルを置き換えて、バックアップを作成する
//"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");

ファイルの属性を取得、設定する

この章の内容は、「ファイルの属性を取得、設定する」に移しました。

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

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

  • 履歴:
  • 2006/11/20 属性を削除するコードを追加。
  • 2007/2/19 .NET Framework 2.0に関する記述を追加。My.Computer.FileSystemを使用する方法を追加。
  • 2009/1/15 ファイルの復号化もEncryptとなっていたのを修正。
  • 2010/3/27 項目を細分化し、説明を加えた。FileInfoクラスの例を追加。
  • 2010/9/14 ファイルの属性を取得、設定する方法と、タイムスタンプを取得、設定する方法を別のページに移動。
  • 2013/6/7 「FileクラスとFileInfoクラスのメソッドの違い」を追加など。
  • 2014/10/27 FileSystem.RenameFileメソッドに関する間違いを修正。
  • 2015/1/29 誤字修正。
  • 2016/5/17 誤字修正。

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

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