纯异步nodejs文件夹(目录)复制功能


Posted in NodeJs onSeptember 03, 2019

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文件夹(目录)复制,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

NodeJs 相关文章推荐
nodejs开发环境配置与使用
Nov 17 NodeJs
nodejs中操作mysql数据库示例
Dec 20 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
Nodejs中的this详解
Mar 26 NodeJs
win系统下nodejs环境安装配置
May 04 NodeJs
nodejs连接mysql数据库及基本知识点详解
Mar 20 NodeJs
详解redis在nodejs中的应用
May 02 NodeJs
NodeJs搭建本地服务器之使用手机访问的实例讲解
May 12 NodeJs
解决nodejs的npm命令无反应的问题
May 17 NodeJs
Nodejs实现的操作MongoDB数据库功能完整示例
Feb 02 NodeJs
搭建一个nodejs脚手架的方法步骤
Jun 28 NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 NodeJs
nodejs文件夹深层复制功能
Sep 03 #NodeJs
Nodejs中使用puppeteer控制浏览器中视频播放功能
Aug 26 #NodeJs
nodejs简单抓包工具使用详解
Aug 23 #NodeJs
nodejs使用node-xlsx生成excel的方法示例
Aug 22 #NodeJs
Nodejs libuv运行原理详解
Aug 21 #NodeJs
nodejs和react实现即时通讯简易聊天室功能
Aug 21 #NodeJs
Nodejs 识别图片类型的方法
Aug 15 #NodeJs
You might like
php相当简单的分页类
2008/10/02 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
举例详解PHP脚本的测试方法
2015/08/05 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
js判断背景图片是否加载成功使用img的width实现
2013/05/29 Javascript
原生js实现改变随意改变div属性style的名称和值的结果
2013/09/26 Javascript
IE和Firefox之间在JavaScript语法上的差异
2016/04/22 Javascript
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
javascript如何实现create方法
2019/11/04 Javascript
vue实现商品列表的添加删除实例讲解
2020/05/14 Javascript
使用PYTHON创建XML文档
2012/03/01 Python
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
PyCharm 常用快捷键和设置方法
2017/12/20 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
python docx 中文字体设置的操作方法
2018/05/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
Python使用get_text()方法从大段html中提取文本的实例
2019/08/27 Python
keras模型可视化,层可视化及kernel可视化实例
2020/01/24 Python
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
无谷物狗粮:Pooch & Mutt
2018/05/23 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
祖国在我心中演讲稿
2014/01/15 职场文书
《我的伯父鲁迅先生》教学反思
2014/02/12 职场文书
教师批评与自我批评心得体会
2014/10/16 职场文书
经典爱情感言
2015/08/03 职场文书
MySQL性能压力基准测试工具sysbench的使用简介
2021/04/21 MySQL
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
解析原生JS getComputedStyle
2021/05/25 Javascript
Elasticsearch Recovery 详细介绍
2022/04/19 Java/Android
nginx配置限速限流基于内置模块
2022/05/02 Servers