フォルダをコピーする
スポンサーリンク
.NET Framework には、ディレクトリ (フォルダ) 内をすべてコピーするようなメソッドは用意されていません。手動でディレクトリを作成し、配下にあるすべてのディレクトリとファイルをコピーすることになります。
以下は、その処理をメソッド化したものです。再帰呼び出しを使って、配下にあるすべてのディレクトリとファイルをコピーしています。第 3 引数の "上書き指定" によって同名のファイルの上書きを指定することができます。
サンプルコード
以下にサンプルコードを示します。
C# 全般
/// ------------------------------------------------------------------------------------ /// <summary> /// ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。 /// 新しい場所に同名のファイルがある場合は上書きしません。<summary> /// <param name="stSourcePath"> /// コピー元のディレクトリのパス。</param> /// <param name="stDestPath"> /// コピー先のディレクトリのパス。</param> /// ------------------------------------------------------------------------------------ public static void CopyDirectory(string stSourcePath, string stDestPath) { CopyDirectory(stSourcePath, stDestPath, false); } /// ------------------------------------------------------------------------------------ /// <summary> /// ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。<summary> /// <param name="stSourcePath"> /// コピー元のディレクトリのパス。</param> /// <param name="stDestPath"> /// コピー先のディレクトリのパス。</param> /// <param name="bOverwrite"> /// コピー先が上書きできる場合は true。それ以外の場合は false。</param> /// ------------------------------------------------------------------------------------ public static void CopyDirectory(string stSourcePath, string stDestPath, bool bOverwrite) { // コピー先のディレクトリがなければ作成する if (! System.IO.Directory.Exists(stDestPath)) { System.IO.Directory.CreateDirectory(stDestPath); System.IO.File.SetAttributes(stDestPath, System.IO.File.GetAttributes(stSourcePath)); bOverwrite = true; } // コピー元のディレクトリにあるすべてのファイルをコピーする if (bOverwrite) { foreach (string stCopyFrom in System.IO.Directory.GetFiles(stSourcePath)) { string stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom)); System.IO.File.Copy(stCopyFrom, stCopyTo, true); } // 上書き不可能な場合は存在しない時のみコピーする } else { foreach (string stCopyFrom in System.IO.Directory.GetFiles(stSourcePath)) { string stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom)); if (! System.IO.File.Exists(stCopyTo) ) { System.IO.File.Copy(stCopyFrom, stCopyTo, false); } } } // コピー元のディレクトリをすべてコピーする (再帰) foreach (string stCopyFrom in System.IO.Directory.GetDirectories(stSourcePath)) { string stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stCopyFrom)); CopyDirectory(stCopyFrom, stCopyTo, bOverwrite); } }
使用例は以下のようになります。
C# 全般
// フォルダをコピーする (コピー先に同名のファイルがある場合は上書きしない) CopyDirectory(@"C:\Hoge\", @"C:\Foo\"); // フォルダをコピーする (コピー先に同名のファイルがある場合は上書きする) CopyDirectory(@"C:\Hoge\", @"C:\Bar\", true);
関連するリファレンス
準備中です。