在node.js中recursion复制文件夹
有一个更简单的方法来复制文件夹及其所有内容,而无需手动执行一系列fs.readir
, fs.readfile
, fs.writefile
recursion?
只是想知道如果我错过了这样一个理想的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
这是我的方法来解决这个问题,没有任何额外的模块。 只需使用内置的fs
和path
模块。
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); } };
当ncp
和wrench
ncp
, 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复制文件夹