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

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

(0)

相关推荐

  • Nodejs 复制文件/文件夹的方法

    1.使用fs复制文件 使用fs对象的readFileSync,writeFileSync方法进行读写操作复制 cp.js function copyIt(from, to) { fs.writeFileSync(to, fs.readFileSync(from)); //fs.createReadStream(src).pipe(fs.createWriteStream(dst));大文件复制 } copyIt(from.js,to.js); 这样就可以复制from.js到to.js 2.使用l

  • nodejs文件夹深层复制功能

    前段时间接到领导要求,运营那边会时不时的给我一些.html文件,让我呢把里面的某些东西给解析出来插入到数据库.本来就是解析dom元素,然后插入,可是有点麻烦的是运营给我的文件都是多层级的:比如下面的: 我所需要是将运营给的文件夹中每个文件都复制到某个文件夹中(test),然后取test中所有文件进行解析.开始的时候本人崩着能吃苦耐劳的精神,每次都是复制粘贴,可是这是容易出错不说,关键我们是个程序员啊,就应该用程序员的方式来解决嘛.有些同志会说这很简单啊 找到'E:819数据819'这个文件夹,将

  • nodejs调用cmd命令实现复制目录

    工作中一直需要对一些官网进行文件复制,并且替换内部的一些信息,以前都是手动操作的,或者通过自己写的firefox扩展来进行文件操作的. 现在前端有nodejs了,为什么不用nodejs写个一键式的呢~~ 1.复制目录 复制文件的时候,如果直接创建一个不存在的文件目录下就不成功了.要上级目录存在才可以.(nodejs API接触时间不长,如有有误,谢谢指正). 这样在写入文件的时候就检测一下目录是否存在,不存在则判断上级目录,之后一级一级目录创建回来,之后就可以复制文件了 var dirCache

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

    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 === 'func

  • Node.js 文件夹目录结构创建实例代码

    第一次接触NodeJS的文件系统就被它的异步的响应给搞晕了,后来发现NodeJS判断文件夹是否存在和创建文件夹是还有同步方法的,但是还是想尝试使用异步的方法去实现. 使用的方法: fs.exists(path, callback); fs.mkdir(path, [mode], callback); 实现文件夹目录结构的创建代码实现如下: //创建文件夹 function mkdir(pos, dirArray,_callback){ var len = dirArray.length; con

  • NodeJS 文件夹拷贝以及删除功能

    文件夹拷贝 function CopyDirectory(src, dest) { if (IsFileExist(dest) == false) { fs.mkdirSync(dest); } if (fs.existsSync(src) == false) { return false; } // console.log("src:" + src + ", dest:" + dest); // 拷贝新的内容进去 var dirs = fs.readdirSync

  • java 对文件夹目录进行深度遍历实例代码

    java 对文件夹目录进行深度遍历实例代码 1.题目 对指定目录进行所有内容的列出(包含子目录中的内容),也可以理解为对目录进行深度遍历. 2.解题思想 从电脑中获取文件目录,建立函数对其遍历,在这个函数中需要对该目录中的每个文件进行判断,如果文件还是目录,则调用函数本身继续对其进行遍历,如果文件不是目录,则直接输出文件名.为了加强显示的效果,我们还可以建立一个getSpace函数,对其进行缩进. 需要注意的是,不要直接遍历C盘的内容,其目录层次太深,含有太多的系统级文件,容易返回为空,导致空指

  • Asp.net获取服务器指定文件夹目录文件并提供下载的方法

    本文实例讲述了Asp.net获取服务器指定文件夹目录文件并提供下载的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: string dirPath = HttpContext.Current.Server.MapPath("uploads/"); if (Directory.Exists(dirPath)) {        //获得目录信息        DirectoryInfo dir = new DirectoryInfo(dirPath);       

  • 统计Linux 中文件和文件夹/目录的数量(示例代码)

    嗨,伙计们,今天我们再次带来一系列可以多方面帮助到你的复杂的命令. 通过操作命令,可以帮助您计数当前目录中的文件和目录.递归计数,统计特定用户创建的文件列表等. 在本教程中,我们将向您展示如何使用多个命令,并使用 ls.egrep.wc 和 find 命令执行一些高级操作. 下面的命令将可用在多个方面. 为了实验,我打算总共创建 7 个文件和 2 个文件夹(5 个常规文件和 2 个隐藏文件). 下面的 tree 命令的输出清楚的展示了文件和文件夹列表. # tree -a /opt /opt ├

  • C++遍历文件夹目录的方法

    一.方法一:VS2019 // dirlist.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include <string> #include <io.h> #include <vector> #include <iostream> using namespace std; /************************************************************

  • 易语言在指定路径下新建一个文件夹目录

    创建目录命令 英文命令:MkDir 操作系统支持:Windows.Linux   所属类别:磁盘操作 创建一个新的目录.成功返回真,失败返回假. 语法:  逻辑型  创建目录 (欲创建的目录名称) 例程 说明 按钮被点击后弹出一个"浏览文件夹"对话框,选择一个路径后,将该路径存放在"创建目录路径"变量中,然后和"目录名编辑框"中的内容组成了要创建文件夹的完整路径名,并用"创建目录"命令创建它,将创建结果存放在"是否创

  • centos系统修改创建文件夹目录的显示颜色

    前言 linux系统默认目录颜色是蓝色的,在黑背景下看不清楚,可以通过以下2种方法修改ls查看的颜色. 方法: 1.拷贝/etc/DIR_COLORS文件为当前主目录的 .dir_colors cp /etc/DIR_COLORS ~/.dir_colors 2.修改~/.dir_colors中DIR对应的颜色 vim ~/.dir_colors 找到下面这一行: DIR 01;34(01:粗体,34:蓝色) 改为: DIR 01;33(01:粗体,33:黄色) 解释: 效果的具体代码如下 1)

随机推荐