212

fs.readir、、のシーケンスを手動で再帰的fs.readfileに実行せずに、フォルダーとそのすべてのコンテンツをコピーする簡単な方法はありますか?fs.writefile

理想的には次のように機能する関数がないのではないかと思っています。

fs.copy("/path/to/source/folder", "/path/to/destination/folder");
4

26 に答える 26

86

これは、追加のモジュールなしでこの問題を解決するための私のアプローチです。ビルトインfspathモジュールを使用するだけです。

注:これは fs の読み取り/書き込み機能を使用するため、メタデータ (作成時間など) はコピーされません。Node.js 8.5 の時点でcopyFileSync、OS コピー関数を呼び出してメタデータもコピーする関数が利用可能になりました。まだテストしていませんが、それらを置き換えるだけで機能するはずです。( https://nodejs.org/api/fs.html#fs_fs_copyfilesync_src_dest_flagsを参照)

var fs = require('fs');
var path = require('path');

function copyFileSync( source, target ) {

    var targetFile = target;

    // If target is a directory, a new file with the same name will be created
    if ( fs.existsSync( target ) ) {
        if ( fs.lstatSync( target ).isDirectory() ) {
            targetFile = path.join( target, path.basename( source ) );
        }
    }

    fs.writeFileSync(targetFile, fs.readFileSync(source));
}

function copyFolderRecursiveSync( source, target ) {
    var files = [];

    // Check if folder needs to be created or integrated
    var targetFolder = path.join( target, path.basename( source ) );
    if ( !fs.existsSync( targetFolder ) ) {
        fs.mkdirSync( targetFolder );
    }

    // Copy
    if ( fs.lstatSync( source ).isDirectory() ) {
        files = fs.readdirSync( source );
        files.forEach( function ( file ) {
            var curSource = path.join( source, file );
            if ( fs.lstatSync( curSource ).isDirectory() ) {
                copyFolderRecursiveSync( curSource, targetFolder );
            } else {
                copyFileSync( curSource, targetFolder );
            }
        } );
    }
}
于 2014-09-25T12:43:07.173 に答える
59

ディレクトリとその内容を別のディレクトリに再帰的にコピーする関数を次に示します。

const fs = require("fs")
const path = require("path")

/**
 * Look ma, it's cp -R.
 * @param {string} src  The path to the thing to copy.
 * @param {string} dest The path to the new copy.
 */
var copyRecursiveSync = function(src, dest) {
  var exists = fs.existsSync(src);
  var stats = exists && fs.statSync(src);
  var isDirectory = exists && stats.isDirectory();
  if (isDirectory) {
    fs.mkdirSync(dest);
    fs.readdirSync(src).forEach(function(childItemName) {
      copyRecursiveSync(path.join(src, childItemName),
                        path.join(dest, childItemName));
    });
  } else {
    fs.copyFileSync(src, dest);
  }
};
于 2014-03-05T00:04:48.487 に答える
54

フォルダーとそのコンテンツのコピーをサポートするモジュールがいくつかあります。最も一般的なのはwrench.jsです。

// Deep-copy an existing directory
wrench.copyDirSyncRecursive('directory_to_copy', 'location_where_copy_should_end_up');

代替手段はnode-fs-extraです:

fs.copy('/tmp/mydir', '/tmp/mynewdir', function (err) {
  if (err) {
    console.error(err);
  } else {
    console.log("success!");
  }
}); // Copies directory, even if it has subdirectories or files
于 2012-12-09T09:26:19.193 に答える
29

Linux/Unix OS の場合、シェル構文を使用できます。

const shell = require('child_process').execSync;

const src = `/path/src`;
const dist = `/path/dist`;

shell(`mkdir -p ${dist}`);
shell(`cp -r ${src}/* ${dist}`);

それでおしまい!

于 2016-12-08T00:58:47.653 に答える
16

これは、Node.js 10 では非常に簡単です。

const FSP = require('fs').promises;

async function copyDir(src,dest) {
    const entries = await FSP.readdir(src, {withFileTypes: true});
    await FSP.mkdir(dest);
    for(let entry of entries) {
        const srcPath = Path.join(src, entry.name);
        const destPath = Path.join(dest, entry.name);
        if(entry.isDirectory()) {
            await copyDir(srcPath, destPath);
        } else {
            await FSP.copyFile(srcPath, destPath);
        }
    }
}

destこれは存在しないことを前提としています。

于 2018-09-28T20:52:36.623 に答える
9

ほんの数ステップでソースフォルダーを別の宛先フォルダーにコピーする小さな実用的な例を作成しました( ncpを使用したshift66の回答に基づいています):

ステップ 1 - ncp モジュールをインストールします。

npm install ncp --save

ステップ 2 - copy.js を作成します ( srcPath変数とdestPath変数を必要なものに変更します)。

var path = require('path');
var ncp = require('ncp').ncp;

ncp.limit = 16;

var srcPath = path.dirname(require.main.filename); // Current folder
var destPath = '/path/to/destination/folder'; // Any destination folder

console.log('Copying files...');
ncp(srcPath, destPath, function (err) {
  if (err) {
    return console.error(err);
  }
  console.log('Copying files complete.');
});

ステップ 3 - 実行

node copy.js
于 2016-02-03T16:15:12.403 に答える
1

このコードは問題なく機能し、任意のフォルダーを任意の場所に再帰的にコピーします。ただし、Windows のみです。

var child = require("child_process");
function copySync(from, to){
    from = from.replace(/\//gim, "\\");
    to = to.replace(/\//gim, "\\");
    child.exec("xcopy /y /q \"" + from + "\\*\" \"" + to + "\\\"");
}

新しいプレーヤーを作成するためのテキストベースのゲームに最適です。

于 2014-11-19T15:06:56.790 に答える
0

これが私がやった方法です:

let fs = require('fs');
let path = require('path');

それで:

let filePath = // Your file path

let fileList = []
    var walkSync = function(filePath, filelist)
    {
        let files = fs.readdirSync(filePath);
        filelist = filelist || [];
        files.forEach(function(file)
        {
            if (fs.statSync(path.join(filePath, file)).isDirectory())
            {
                filelist = walkSync(path.join(filePath, file), filelist);
            }
            else
            {
                filelist.push(path.join(filePath, file));
            }
        });

        // Ignore hidden files
        filelist = filelist.filter(item => !(/(^|\/)\.[^\/\.]/g).test(item));

        return filelist;
    };

次に、メソッドを呼び出します。

This.walkSync(filePath, fileList)
于 2018-11-08T16:35:35.243 に答える