纯异步nodejs文件夹(目录)复制功能
2019-09-03 11:01
1221 查看
node.js 复制文件夹
思路:
1、callback 驱动
2、递归所有需要复制文件
3、在一定阀值下并发复制文件
var async = require("async"); var fs = require("fs"); var path = require("path"); // cursively make dir function mkdirs(p, mode, f, made) { if (typeof mode === 'function' || mode === undefined) { f = mode; mode = 0777 & (~process.umask()); } if (!made) made = null; var cb = f || function () {}; if (typeof mode === 'string') mode = parseInt(mode, 8); p = path.resolve(p); fs.mkdir(p, mode, function (er) { if (!er) { made = made || p; return cb(null, made); } switch (er.code) { case 'ENOENT': mkdirs(path.dirname(p), mode, function (er, made) { if (er) { cb(er, made); } else { mkdirs(p, mode, cb, made); } }); break; // In the case of any other error, just see if there's a dir // there already. If so, then hooray! If not, then something // is borked. default: fs.stat(p, function (er2, stat) { // if the stat fails, then that's super weird. // let the original error be the failure reason. if (er2 || !stat.isDirectory()) { cb(er, made); } else { cb(null, made) }; }); break; } }); } // single file copy function copyFile(file, toDir, cb) { async.waterfall([ function (callback) { fs.exists(toDir, function (exists) { if (exists) { callback(null, false); } else { callback(null, true); } }); }, function (need, callback) { if (need) { mkdirs(path.dirname(toDir), callback); } else { callback(null, true); } }, function (p, callback) { var reads = fs.createReadStream(file); var writes = fs.createWriteStream(path.join(path.dirname(toDir), path.basename(file))); reads.pipe(writes); //don't forget close the when all the data are read reads.on("end", function () { writes.end(); callback(null); }); reads.on("error", function (err) { console.log("error occur in reads"); callback(true, err); }); } ], cb); } // cursively count the files that need to be copied function _ccoutTask(from, to, cbw) { async.waterfall([ function (callback) { fs.stat(from, callback); }, function (stats, callback) { if (stats.isFile()) { cbw.addFile(from, to); callback(null, []); } else if (stats.isDirectory()) { fs.readdir(from, callback); } }, function (files, callback) { if (files.length) { for (var i = 0; i < files.length; i++) { _ccoutTask(path.join(from, files[i]), path.join(to, files[i]), cbw.increase()); } } callback(null); } ], cbw); } // wrap the callback before counting function ccoutTask(from, to, cb) { var files = []; var count = 1; function wrapper(err) { count--; if (err || count <= 0) { cb(err, files) } } wrapper.increase = function () { count++; return wrapper; } wrapper.addFile = function (file, dir) { files.push({ file : file, dir : dir }); } _ccoutTask(from, to, wrapper); } function copyDir(from, to, cb) { if(!cb){ cb=function(){}; } async.waterfall([ function (callback) { fs.exists(from, function (exists) { if (exists) { callback(null, true); } else { console.log(from + " not exists"); callback(true); } }); }, function (exists, callback) { fs.stat(from, callback); }, function (stats, callback) { if (stats.isFile()) { // one file copy copyFile(from, to, function (err) { if (err) { // break the waterfall callback(true); } else { callback(null, []); } }); } else if (stats.isDirectory()) { ccoutTask(from, to, callback); } }, function (files, callback) { // prevent reaching to max file open limit async.mapLimit(files, 10, function (f, cb) { copyFile(f.file, f.dir, cb); }, callback); } ], cb); } var start = new Date().getTime(); copyDir("F:\\gear", "F:\\gear2", function (err) { if (err) { console.log("error ocur"); console.dir(err); } else { console.log("copy ok"); console.log("consume time:" + (new Date().getTime() - start)) } });
总结
以上所述是小编给大家介绍的纯异步nodejs文件夹(目录)复制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
您可能感兴趣的文章:
相关文章推荐
- AngularJs 后台 纯异步nodejs文件夹(目录)复制
- Qt(五)--- 文件操作以及实现文件的复制操作并且在目的目录创建相应文件夹
- XCopy复制文件夹命令及参数详解以及xcopy拷贝目录并排除特定文件
- java中File文件的创建,删除,复制,移动,以及目录文件的删除等等,主要是文件及文件夹的操作
- java中 功能:演示文件字符流的案例 * 将文件从一个文件夹复制到另一个文件夹 */
- 复制单级文件夹及其下面的内容到指定的目录下去
- 使用IO流复制文件,指定 文件/文件夹 绝对目录
- C# 目录(文件夹)复制实现
- java文件夹复制到指定目录
- Ubuntu下如何把一个文件夹复制到另一个目录下
- U盘中删除文件时提示:无法删除空文件夹,提示该目录不是空的(不能删除、不能复制)
- linux 复制目录(文件夹)和打包命令
- 实现文件的创建、删除、复制、压缩、解压以及目录的创建、删除、复制、压缩解压等功能
- 文件夹操作之----复制目录
- Android手机SD卡文件或目录拷贝、复制、粘贴功能实现代码
- Java新建目录、新建文件、删除文件、删除文件夹、删除文件夹里面的所有文件、复制整个文件夹内容
- linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹
- php复制目录下的所有文件及文件夹
- java复制文件夹下全部的文件到指定目录
- nodejs调用cmd命令实现复制目录