Nodachisoft Nodachisoft logo, Katana Sword Icon
  
@あまじ✎ 2021年12月16日に更新

javascript(nodejs) でディレクトリを再帰的にコピーする

javascript(nodejs) でディレクトリを再帰的にコピーする

概要

nodejs 上で動く javascript で、指定したディレクトリを丸々、別の場所にコピーしたい場合があります。

再帰的に、かつ nodejs の標準機能のみで実現したコードを参考として載せておきます。

なお、このブログは React ベース(Gatsby)で記述していますが、 新しい記事を作成するときはテンプレート一式のフォルダを npm run xxxx コマンドでコピー作成することで簡単に書けるようにしており、そのコピー作成などにも今回のコードは使用しています。

コード

以下は指定したパス(ディレクトリ)を、目的の場所に再帰的にコピーする関数 CopyFilesRecursively を定義して、テストとして呼び出したものです。

 
copyfiles_recursively.js
/**
* 再帰的にパス配下のファイル・フォルダ一覧を取得
 * @param {string} targetpath 探索する対象のパス
 * @param {number} depth 探索する深さ。オプション。デフォルトは指定なし。
 * @returns 取得したファイル、ディレクトリの{path:絶対パス, isDir:ディレクトリか} を配列で返す
 */
 var GetFilelistRecursively2 = ((targetpath, depth = -1) => {
    let result = [];
    var dirs = fs.readdirSync(targetpath);
    dirs.forEach(file => {
        let filepath = targetpath + "/" + file;
        let isDir = fs.lstatSync(filepath).isDirectory();
        result.push({path:filepath, isDir:isDir });
        if ( isDir ) {
            if ( depth == 0 ) return result;
            result = result.concat( GetFilelistRecursively2(filepath, depth - 1));
        }
    });
    return result;
});

/**
 * 指定したパス配下のフォルダ、ファイルを同じ構造で再帰的にコピーします。
 * コピー先のディレクトリが存在しない場合、フォルダが作成され、その中にコピーします。
 * 権限不足や容量不足の場合、例外を検知し停止します。
 * @param {string} srcpath コピー元のパス
 * @param {string} destpath コピー先のパス
 */
var CopyFilesRecursively = ((srcpath, destpath) => {
    if ( !fs.existsSync(destpath) ) {
        fs.mkdirSync(destpath,{ recursive: true } );
    }
    let targetList = GetFilelistRecursively2( srcpath );
    targetList.forEach( node => {
        let newpath = destpath + node.path.substring(srcpath.length);
        if ( node.isDir) {
            if ( !fs.existsSync(destpath) ) fs.mkdirSync(newpath);
        } else {
            fs.copyFile(node.path, newpath, err => {if (err) throw err});
        }
    });
});

// 使用例
CopyFilesRecursively("C:/testdir", "C:/testdir2");

二つの関数である GetFilelistRecursively2CopyFilesRecursively を定義しています。 フォルダをコピーするときは後者の CopyFilesRecursively を呼び出します。

コードの中で、コピー元のファイルやフォルダの一覧を再帰的に取得し、その後に 指定した先のパスに構造をコピーしています。

なお、GetFilelistRecursively2 はファイルやフォルダの一覧を取得する関数であり、 他の記事コチラで作成したものを使用しています。

興味がありましたら、そちらもご参照ください。

参考

変更履歴

日付 変更概要
なし
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

npm run スクリプトに引数を渡す方法

npm run スクリプトに引数を渡す方法

#Nodejs#Javascript✎ 2021-12-16
引数を npm run のスクリプト(npm-run-script)に渡して動的な処理をしたいことがありましたので、方法をサンプルコード付きで備忘しておきます
目次
javascript(nodejs) でディレクトリを再帰的にコピーする
javascript(nodejs) でディレクトリを再帰的にコピーする
概要
概要
コード
コード
参考
参考
変更履歴
変更履歴
Nodachisoft © 2021