C#でディレクトリ(フォルダー)を移動する方法について紹介します。
ディレクトリの移動には、System.IO名前空間のDirectoryInfoクラスのMoveToメソッドを使用するか、DirectoryクラスのMove静的メソッドを使用します。
目次
DirectoryInfoクラスのMoveToメソッドで移動
DirectoryInfoクラスのMoveToメソッドの構文は次のようになります。
1 |
public void MoveTo (string destDirName); |
MoveToメソッドには引数のdestDirNameに移動後のパスを指定します。
DirectoryInfo.MoveToメソッドの使用例
以下にMoveToメソッドの使用例を示します。
1 2 3 4 5 6 7 8 |
// ディレクトリパス string path = @"C:\Test\Source\Dir1"; // DirectoryInfoのインスタンスを生成する DirectoryInfo di = new DirectoryInfo(path); // 移動後のディレクトリ名(パス) string destDirName = @"C:\Test\Dest\Dir2"; // ディレクトリを移動する di.MoveTo(destDirName); |
上記の例では「C:\Test\Source」にあるDir1ディレクトリを「C:\Test\Dest」にDir2というディレクトリ名として移動しています。
MoveToメソッドでは移動先のパス(ここでは「C:\Test\Dest」)が存在しない場合には「System.IO.DirectoryNotFoundException: ‘パスの一部が見つかりません。’」という例外が発生します。
また、移動後のディレクトリパス(ここでは「C:\Test\Dest\Dir2」)が存在する場合には「System.IO.IOException: ‘既に存在するファイルを作成することはできません。’」という例外が発生します。
移動する前にはDirectoryInfo.Existsプロパティなどで移動先のディレクトリが存在するかどうかの確認をした方がよさそうです。
MoveToメソッドでは移動先に別のドライブ(ボリューム)を指定することができません。例えば上記の例で「C:\Test\Source\Dir1」を「D:\MoveDir\Dir」に移動しようとすると「System.IO.IOException: ‘ソースとターゲット パスは同一のルートを持たなければなりません。[移動] 操作はボリューム間で行えません。’」という例外が発生します。
別のドライブにディレクトリを移動する方法は以下の記事をご覧ください。
DirectoryクラスのMove静的メソッドで移動
DirectoryクラスのMove静的メソッドの構文は次のようになります。
1 |
public static void Move (string sourceDirName, string destDirName); |
Move静的メソッドの第1引数のsourceDirNameには移動するディレクトリのパスを指定します。第2引数のdestDirNameには移動後のディレクトリのパスを指定します。destDirNameについては、DirectoryInfoクラスのMoveToメソッド同じです。
Directory.Move静的メソッドの使用例
以下にMove静的メソッドの使用例を示します。
1 2 3 4 5 6 |
// 移動するディレクトリ名(パス) string sourceDirName = @"C:\Test\Source\Dir1"; // 移動先のディレクトリ名(パス) string destDirName = @"C:\Test\Dest\Dir2"; // ディレクトリを移動する Directory.Move(sourceDirName, destDirName); |
DirectoryクラスのMove静的メソッドもDirectoryInfoクラスのMoveToメソッド同様、移動先のディレクトリが存在しない場合、移動後のディレクトリが存在する場合、別のドライブに移動しようとした時には例外が発生します。
ディレクトリ名のリネーム
DirectoryInfoクラスのMoveメソッド、DirectoryクラスのMove静的メソッドはディレクトリ名の変更にも使用します。移動対象のディレクトリの名称を同階層で変更することでディレクトリ名のリネームが行われます。
次の例ではDirectoryクラスのMove静的メソッドを使用してBeforeNameという名前のディレクトリをAfterNameという名前にリネームしています。
1 2 |
// DirectoryクラスのMove静的メソッドでのリネーム Directory.Move(@"C:\Data\Documents\BeforeName", @"C:\Data\Documents\AfterName"); |
DirectoryInfoクラスのMoveメソッド、およびDirectoryクラスのMove静的メソッドはMove(移動)という名称ですが、実質的な処理としてはリネームを行っています。そのため、別のドライブ(ボリューム)に移動できないなどの制限があるのです。
サンプルプログラム
Windowsフォームアプリケーションでのプログラムの実装例を記載します。
ユーザーインターフェース
フォームのインターフェースは次のようにします。
ソースコード
サンプルプログラムのフォームには次のようなソースコードを記述します。
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 |
using System; using System.Windows.Forms; // System.IOのusingを追加 using System.IO; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } // DirectoryInfoクラスのMoveToメソッドで移動 private void button1_Click(object sender, EventArgs e) { try { // 移動前のディレクトリパス string sourceDirName = textBox1.Text; // 移動後のディレクトリパス string destDirName = textBox2.Text; // 移動前のディレクトリのDirectoryInfoのインスタンスを生成 DirectoryInfo diSource = new DirectoryInfo(sourceDirName); // 移動後のディレクトリのDirectoryInfoのインスタンスを生成 DirectoryInfo diDest = new DirectoryInfo(destDirName); if (!diDest.Parent.Exists) { MessageBox.Show($"移動先のディレクトリが見つかりませんでした。"); return; } else if (diDest.Exists) { MessageBox.Show($"移動後のディレクトリが既に存在しています。"); return; } // ディレクトリを移動 diSource.MoveTo(destDirName); // 完了メッセージを表示 MessageBox.Show($"{sourceDirName}を{destDirName}に移動しました。"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } // DirectoryクラスのMove静的メソッドで移動 private void button2_Click(object sender, EventArgs e) { try { // 移動前のディレクトリパス string sourceDirName = textBox1.Text; // 移動後のディレクトリパス string destDirName = textBox2.Text; // 移動後のディレクトリのDirectoryInfoのインスタンスを生成 DirectoryInfo diDest = new DirectoryInfo(destDirName); if (!diDest.Parent.Exists) { MessageBox.Show($"移動先のディレクトリが見つかりませんでした。"); return; } else if (diDest.Exists) { MessageBox.Show($"移動後のディレクトリが既に存在しています。"); return; } // ディレクトリを移動 Directory.Move(sourceDirName, destDirName); // 完了メッセージを表示 MessageBox.Show($"{sourceDirName}を{destDirName}に移動しました。"); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } } |
サンプルの実行
作成したプログラムを実行します。
[button1]がDirectoryInfoクラスのMoveToメソッドのディレクトリを移動する処理を実行します。
[button2]がDirectoryクラスのMove静的メソッドのディレクトリを移動する処理を実行します。
CドライブにWork > SourceDirectory > 移動前の順にディレクトリを作成てから、CドライブにWork > DestinationDirectoryの順にディレクトリを作成します。
移動するディレクトリのテキストボックスに「C:\Work\SourceDirectory\移動前」を入力します。
移動後のディレクトリのテキストボックスに「C:\Work\DestinationDirectory\移動後」を入力します。
[button1]をクリックします。
メッセージが表示され、移動前ディレクトリが移動後ディレクトリとして移動されます。
[button1]をクリックする前の状態にディレクトリを戻します。
[button2]をクリックします。
[button1]の時と同様に、移動前のディレクトリが移動後のディレクトリとして移動されました。