C#フォルダをコピーする

スポンサーリンク

.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);

関連するリファレンス

準備中です。

スポンサーリンク