在node.js中recursion复制文件夹

有一个更简单的方法来复制文件夹及其所有内容,而无需手动执行一系列fs.readirfs.readfilefs.writefilerecursion?

只是想知道如果我错过了这样一个理想的function

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

你可以使用ncp模块。 我认为这是你所需要的

有一些模块支持复制文件夹的内容。 最stream行的将是扳手

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

另一种select是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 

这是我的方法来解决这个问题,没有任何额外的模块。 只需使用内置的fspath模块。

 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 ); } } ); } } 
 /** * 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 (exists && isDirectory) { fs.mkdirSync(dest); fs.readdirSync(src).forEach(function(childItemName) { copyRecursiveSync(path.join(src, childItemName), path.join(dest, childItemName)); }); } else { fs.linkSync(src, dest); } }; 

ncpwrench ncpfs-extra为我工作:

https://www.npmjs.com/package/fs-extra

我创build了一个小的工作示例,只需几个步骤就可以将源文件夹复制到另一个目标文件夹(基于使用ncp的@ shift66答案):

第1步 – 安装ncp模块:

 npm install ncp --save 

第2步 – 创buildcopy.js(根据需要修改srcPath和destPath vars):

 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 

对于linux / unix操作系统,您可以使用shell语法

 const shell = require('child_process').execSync ; const src= `/path/src`; const dist= `/path/dist`; shell(`mkdir -p ${dist}`); shell(`cp -r ${src}/* ${dist}`); 

而已!

由于我只是build立一个简单的节点脚本,我不希望脚本的用户需要导入一堆外部模块和依赖项,所以我把我的思想上限,并search从bash运行命令贝壳。

这个node.js代码片断recursion地将名为node-webkit.app的文件夹复制到名为build的文件夹:

  child = exec("cp -r node-webkit.app build", function(error, stdout, stderr) { sys.print("stdout: " + stdout); sys.print("stderr: " + stderr); if(error !== null) { console.log("exec error: " + error); } else { } }); 

感谢Dzone的Lance Pollard让我开始。

上面的代码片段仅限于基于Unix的平台,如Mac OS和Linux,但类似的技术可能适用于Windows。

此代码将工作得很好,recursion地将任何文件夹复制到任何位置。 仅限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+"\\\""); } 

适用于我的基于文本的游戏来创build新玩家。

是的,虽然ncp cool

你可能想/应该promisify它的function,使super cool 。 既然你在这里,把它添加到一个tools文件来重用它。

下面是一个工作版本是Async并使用Promises


index.js

 const {copyFolder} = require('./tools/'); return copyFolder( yourSourcePath, yourDestinationPath ) .then(() => { console.log('-> Backup completed.') }) .catch((err) => { console.log("-> [ERR] Could not copy the folder: ", err); }) 

tools.js

 const ncp = require("ncp"); /** * Promise Version of ncp.ncp() * * This function promisifies ncp.ncp(). * We take the asynchronous function ncp.ncp() with * callback semantics and derive from it a new function with * promise semantics. */ ncp.ncpAsync = function (sourcePath, destinationPath) { return new Promise(function (resolve, reject) { try { ncp.ncp(sourcePath, destinationPath, function(err){ if (err) reject(err); else resolve(); }); } catch (err) { reject(err); } }); }; /** * Utility function to copy folders asynchronously using * the Promise returned by ncp.ncp(). */ const copyFolder = (sourcePath, destinationPath) => { return ncp.ncpAsync(sourcePath, destinationPath, function (err) { if (err) { return console.error(err); } }); } module.exports.copyFolder = copyFolder; 

fs-extra模块就像一个魅力。

安装fs-extra

 $ npm install fs-extra 

以下是将源目录复制到目标目录的程序。

 // include fs-extra package var fs = require("fs-extra"); var source = 'folderA' var destination = 'folderB' // copy source folder to destination fs.copy(source, destination, function (err) { if (err){ console.log('An error occured while copying the folder.') return console.error(err) } console.log('Copy completed!') }); 

参考

fs-extra: https : //www.npmjs.com/package/fs-extra

示例: Node.js教程 – Node.js复制文件夹