C#でファイルを移動する方法について紹介します。
ファイルの移動には、System.IO名前空間のFileInfoクラスのMoveToメソッドを使用するか、FileクラスのMove静的メソッドを使用します。
目次
FileInfoクラスのMoveToメソッドで移動
FileInfoクラスのMoveToメソッドの構文は次のようになります。
1 |
public void MoveTo (string destFileName); |
MoveToメソッドのパラメーターのdestFileNameに移動後のパスを指定します。
FileInfo.MoveToメソッドの使用例
以下にMoveToメソッドの使用例を示します。
1 2 3 4 5 6 7 8 |
// ファイルパス string path = @"C:\Test\Source\BeforeMove.txt"; // FileInfoのインスタンスを生成する FileInfo fileInfo = new FileInfo(path); // 移動後のファイル名(パス) string destFileName = @"C:\Test\Dest\AfterMove.txt"; // ファイルを移動する fileInfo.MoveTo(destFileName); |
上記の例では「C:\Test\Source」フォルダーにある「BeforeMove.txt」ファイルを「C:\Test\Dest」フォルダーに「AfterMove.txt」という名前で移動しています。
MoveToメソッドでは移動先のフォルダーパス(ここでは「C:\Test\Dest」)が存在しない場合には「System.IO.FileNotFoundException: ‘パスの一部が見つかりません。’」という例外が発生します。
また、移動後のファイルパス(ここでは「C:\Test\Dest\AfterMove.txt」)が存在する場合には「System.IO.IOException: ‘既に存在するファイルを作成することはできません。’」という例外が発生します。
ファイルを移動する前にはDirectory.Exists静的メソッドや、FileInfo.Existsプロパティなどで、移動先のフォルダーとファイルが存在するかどうかを確認した方が安全です。
ディレクトリを移動するDirectoryInfoクラスのMoveToメソッドでは、異なるドライブ間での移動はできませんが、FileInfoクラスのMoveToメソッドでは、移動先に別のドライブ(ボリューム)を指定することができます。例えば上記の例で「C:\Test\Source\BeforeMove.txt」を「D:\Dest\AfterMove.txt」に移動するとDirectoryInfoクラスのMoveToメソッドで発生する「System.IO.IOException: ‘ソースとターゲット パスは同一のルートを持たなければなりません。[移動] 操作はボリューム間で行えません。’」という例外は発生せず、ファイルの移動が完了します。
FileクラスのMove静的メソッドで移動
FileクラスのMove静的メソッドの構文は次のようになります。
1 |
public static void Move (string sourceFileName, string destFileName); |
Move静的メソッドの1つ目のパラメーターのsourceDirNameには移動するファイルのパスを指定します。2つ目のパラメーターのdestFileNameには移動後のファイルのパスを指定します。destFileNameについては、FileInfoクラスのMoveToメソッド同じです。
File.Move静的メソッドの使用例
以下にMove静的メソッドの使用例を示します。
1 2 3 4 5 6 |
// 移動するファイル名(パス) string sourceDirName = @"C:\Test\Source\BeforeMove.txt"; // 移動先のファイル名(パス) string destFileName = @"C:\Test\Dest\AfterMove.txt"; // ファイルを移動する File.Move(sourceDirName, destFileName); |
FileクラスのMove静的メソッドもFileInfoクラスのMoveToメソッド同様に、移動先のフォルダーが存在しない場合や、移動後のファイルが存在する場合には例外が発生します。
ファイル名のリネーム
FileInfoクラスのMoveメソッド、FileクラスのMove静的メソッドはファイル名の変更にも使用します。移動対象のファイルの名称を同階層で変更することでファイル名のリネームが行われます。
次の例ではFileクラスのMove静的メソッドを使用してBeforeName.txtという名前のファイルをAfterName.csvという名前にリネームしています。
1 2 |
// FileクラスのMove静的メソッドでのリネーム File.Move(@"C:\Data\Documents\BeforeName.txt", @"C:\Data\Documents\AfterName.csv"); |
サンプルプログラム
Windowsフォームアプリケーションでのプログラムの実装例を記載します。
ユーザーインターフェース
フォームのインターフェースは次のようにします。
移動前のファイルパスを指定するテキストボックス(textBox1)と、移動後のファイルパスを指定するテキストボックス(textBox2)を配置します。
それぞれのテキストボックスにはファイルを参照するダイアログを表示するためのボタンを配置します。
移動前のファイルパスの横にはファイルを開くダイアログボックスを表示するボタン(button1)を配置し、移動後のファイルパスの横には名前を付けて保存ダイアログボックスを表示するボタン(button2)を配置します。
ファイルの移動処理は「button3」ボタンで行います。
ソースコード
サンプルプログラムのフォームには次のようなソースコードを記述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
using System; using System.Windows.Forms; // System.IOのusingを追加 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // 移動元ファイルの参照 private void button1_Click(object sender, EventArgs e) { try { // ファイルを開くダイアログボックスのインスタンスを生成 using (OpenFileDialog dlg = new OpenFileDialog()) { // テキストボックスからファイルパスを取得 string path = textBox1.Text; if (!string.IsNullOrEmpty(path)) { // FileInfoオブジェクトを生成 FileInfo fileInfo = new FileInfo(path); // ディレクトリパスを取得 string directoryName = fileInfo.DirectoryName; // ディレクトリが存在するかどうかを確認 if (Directory.Exists(directoryName)) { // ディレクトリが存在する場合は // ファイルを開くダイアログボックスの初期ディレクトリに設定 dlg.InitialDirectory = directoryName; } } // ダイアログボックスを表示 if (dlg.ShowDialog(this) == DialogResult.Cancel) { // キャンセル時は終了 return; } // 指定されたファイルパスをテキストボックスに設定 textBox1.Text = dlg.FileName; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // 移動先ファイルの参照 private void button2_Click(object sender, EventArgs e) { try { // 名前を付けて保存ダイアログボックスのインスタンスを生成 using (SaveFileDialog dlg = new SaveFileDialog()) { // テキストボックスからファイルパスを取得 string path = textBox2.Text; if (!string.IsNullOrEmpty(path)) { // FileInfoオブジェクトを生成 FileInfo fileInfo = new FileInfo(path); // ディレクトリパスを取得 string directoryName = fileInfo.DirectoryName; // ディレクトリが存在するかどうかを確認 if (Directory.Exists(directoryName)) { // ディレクトリが存在する場合は // ファイルを開くダイアログボックスの初期ディレクトリに設定 dlg.InitialDirectory = directoryName; } } // ダイアログボックスを表示 if (dlg.ShowDialog(this) == DialogResult.Cancel) { // キャンセル時は終了 return; } // 指定されたファイルパスをテキストボックスに設定 textBox2.Text = dlg.FileName; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } // ファイルの移動 private void button3_Click(object sender, EventArgs e) { try { // テキストボックスから移動前のファイルパスを取得 string sourcePath = textBox1.Text; // FileInfoオブジェクトを生成 FileInfo sourceFileInfo = new FileInfo(sourcePath); // ファイルの存在確認 if (!sourceFileInfo.Exists) { MessageBox.Show($"{sourcePath} が見つかりませんでした。"); return; } // テキストボックスから移動後のファイルパスを取得 string destPath = textBox2.Text; // FileInfoオブジェクトを生成 FileInfo destFileInfo = new FileInfo(destPath); // 移動先のフォルダーの存在確認 if (!destFileInfo.Directory.Exists) { MessageBox.Show($"{destFileInfo.DirectoryName} が存在しません。"); return; } // 移動先のファイルの存在確認 if (destFileInfo.Exists) { MessageBox.Show($"{destPath} が既に存在します。"); return; } // ファイルを移動 sourceFileInfo.MoveTo(destPath); // メッセージを表示 MessageBox.Show($"{sourcePath} を {destPath} に移動しました。"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルの実行
作成したプログラムを実行します。
「C:\Work\SourceFile」フォルダーに「移動前.txt」という名前のファイルを作成します。
移動前するファイルのテキストボックスに「C:\Work\SourceFile\移動前.txt」を入力するか「…」ボタンをクリックしてファイルを参照します。
移動後のファイルのテキストボックスに「C:\Work\DestinationFile\移動後.txt」を入力するか「…」ボタンをクリックしてファイルを参照します。
[button3]をクリックします。
ファイルが移動されてメッセージが表示されます。