J#(Java)フォルダをコピーする

スポンサーリンク

.NET Framework には、ディレクトリ (フォルダ) 内をすべてコピーするようなメソッドは用意されていません。手動でディレクトリを作成し、配下にあるすべてのディレクトリとファイルをコピーすることになります。

以下は、その処理をメソッド化したものです。再帰呼び出しを使って、配下にあるすべてのディレクトリとファイルをコピーしています。第 3 引数の "上書き指定" によって同名のファイルの上書きを指定することができます。

サンプルコード

以下にサンプルコードを示します。

J# 全般
/**************************************************************************************
 *      ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。
 *      新しい場所に同名のファイルがある場合は上書きしません。
 *
 * @param   stSourcePath    コピー元のディレクトリのパス。
 * @param   stDestPath      コピー先のディレクトリのパス。
 **************************************************************************************/
public static final void CopyDirectory(final String stSourcePath, final String stDestPath) {
    CopyDirectory(stSourcePath, stDestPath, false);
}

/**************************************************************************************
 *      ファイルまたはディレクトリ、およびその内容を新しい場所にコピーします。
 *
 * @param   stSourcePath    コピー元のディレクトリのパス。
 * @param   stDestPath      コピー先のディレクトリのパス。
 * @param   bOverwrite      コピー先が上書きできる場合は true。それ以外の場合は false。
 **************************************************************************************/
public static final void CopyDirectory(final String stSourcePath, final String stDestPath, boolean bOverwrite) {
    // コピー先のディレクトリがなければ作成する
    if (! System.IO.Directory.Exists(stDestPath)) {
        System.IO.Directory.CreateDirectory(stDestPath);
        System.IO.File.SetAttributes(stDestPath, System.IO.File.GetAttributes(stSourcePath));
        bOverwrite = true;
    }

    // 配下のファイルをすべて取得する
    final String[] stFilePathes = System.IO.Directory.GetFiles(stSourcePath);

    // コピー元のディレクトリにあるすべてのファイルをコピーする
    if (bOverwrite) {
        for (int i = 0; i <= stFilePathes.length - 1; i++) {
            final String stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stFilePathes[i]));
            System.IO.File.Copy(stFilePathes[i], stCopyTo, true);
        }

    // 上書き不可能な場合は存在しない時のみコピーする
    } else {
        for (int i = 0; i <= stFilePathes.length - 1; i++) {
            if (! System.IO.File.Exists(stFilePathes[i])) {
                final String stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stFilePathes[i]));
                System.IO.File.Copy(stFilePathes[i], stCopyTo, false);
            }
        }
    }

    // 配下のディレクトリを総て取得する
    final String[] stDirPathes = System.IO.Directory.GetDirectories(stSourcePath);

    // コピー元のディレクトリをすべてコピーする (再帰)
    for (int i = 0; i <= stDirPathes.length - 1; i++) {
        final String stCopyTo = System.IO.Path.Combine(stDestPath, System.IO.Path.GetFileName(stDirPathes[i]));
        CopyDirectory(stDirPathes[i], stCopyTo, bOverwrite);
    }
}

使用例は以下のようになります。

J# 全般
    // フォルダをコピーする (コピー先に同名のファイルがある場合は上書きしない)
    CopyDirectory("C:\\Hoge\\", "C:\\Foo\\");

    // フォルダをコピーする (コピー先に同名のファイルがある場合は上書きする)
    CopyDirectory("C:\\Hoge\\", "C:\\Foo\\", true);

関連するリファレンス

準備中です。

スポンサーリンク