麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

純異步nodejs文件夾(目錄)復制功能

2019-11-19 10:54:57
字體:
來源:轉載
供稿:網友

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文件夾(目錄)復制,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 少妇一级淫片免费放正片 | 国产午夜精品一区二区三区在线观看 | 欧美日韩在线视频一区 | 国产69精品99久久久久久宅男 | 国产成人高潮免费观看精品 | 青青草好吊色 | 鲁人人人鲁人人鲁精品 | 国产精品区一区二区三区 | 国产毛毛片一区二区三区四区 | 多男操一女视频 | 欧美毛片 | 欧美精品久久久久久久多人混战 | 香蕉国产在线视频 | 国产91九色在线播放 | 成人短视频在线观看免费 | 色阁五月| 中文字幕亚洲一区二区三区 | 免费久久久 | 久久国产不卡 | 欧美1区2区在线观看 | 大学生a级毛片免费视频 | 毛片大全免费 | 亚洲成人综合网站 | 失禁高潮抽搐喷水h | 成人短视频在线观看免费 | 狠狠操精品视频 | 亚洲午夜在线视频 | 一区二区精品视频 | 午夜精品久久久久久中宇 | 天使萌一区二区三区免费观看 | 久久精品久 | 黄色大片大毛片 | 日韩中文字幕一区二区三区 | 黄色av免费网站 | 欧美城网站地址 | 免费黄色小视频网站 | 九九黄色 | 91成人精品 | 久久精品亚洲精品国产欧美kt∨ | 国产免费观看a大片的网站 欧美成人一级 | 国产精品久久久久久久娇妻 |