ディレクトリ(フォルダー)をコピーする [C#]

ディレクトリをコピーする方法を紹介します。
ディレクトリをコピー手段(クラスやメソッドなど)はc#に標準で用意されていません。(DirectoryInfoクラスのCopyToメソッドやDirectoryクラスのCopyメソッドがありません。)
ですので、自分で作成するしかありません。

ディレクトリのコピー

ディレクトリのコピーは、いくつかの操作を1つの処理単位として、それを再帰的に呼び出して行います。
以下に1つの処理単位を操作順に記載します。

  1. コピー先のディレクトリがないかどうか判定する
  2. なければコピー先のディレクトリを作成する
  3. コピー元のディレクトリの属性をコピー先の属性にコピーする
  4. ディレクトリパスの末尾が「\」でないかどうかを判定する
  5. 「\」でなければ「\」を付加する
  6. コピー元のディレクトリにあるファイルを取得する
  7. コピー元のディレクトリにあるファイルをコピー先のディレクトリにコピーする
  8. コピー元のディレクトリのサブディレクトリを取得する
  9. コピー元のディレクトリのサブディレクトリで上記の処理を再帰的に呼び出す

サンプルプログラム

ディレクトリをコピーするサンプルプログラムです。
Windowsフォームアプリケーションでの実装例になります。

ユーザーインターフェース

次のようなフォームを作成します。
ディレクトリのコピーサンプルフォーム

ソースコード

以下の例では、ディレクトリのコピーに必要な一連の処理はメソッドとして作成し、そのメソッドを再帰的に呼び出すようにしています。

実行結果

プログラムを実行してフォームを起動します。

ディレクトリコピーのサンプルフォーム起動

コピーするディレクトリのテキストボックスに「C:\Test\CopyFromDir」を入力します。
コピー後のディレクトリのテキストボックスに「D:\Test\CopyToDir」を入力します。

ディレクトリコピーのサンプルフォームにパスを入力

ボタンをクリックします。

ディレクトリコピーのサンプル実行後のメッセージ

メッセージが表示されディレクトリがコピーされます。

ディレクトリコピーのサンプルコピー元のディレクトリ

ディレクトリコピーのサンプルコピー先のディレクトリ

本記事で紹介したディレクトリのコピーメソッドを使えば、DirectoryInfoクラスのMoveToメソッドやDirectoryクラスのMoveメソッドでは実現できないドライブ間のディレクトリの移動も可能です。

ドライブ間のディレクトリの移動

以下にディレクトリをドライブ間で移動する処理のサンプルコードを記載します。

上記の例ではディレクトリを移動するメソッドをMoveDirectoryという名前で作成しています。
MoveDirectoryメソッドでは移動元と移動先のディレクトリを取得し、CopyDirectoryメソッドを使用してディレクトリをコピーします。コピーが完了したら、移動元のディレクトリをサブディレクトリ、ファイルを含んですべて削除します。