要是实在不知道要干什么,那就喝两杯思路就来了!

导航菜单

Node.js复制一个目录

因为工作需要我们将实现一版使用 Nodejs 拷贝一个目录下所有内容到另外一个位置,好记性不如烂笔头所以就将过程记录下来以备后面再次用到。

/**
 * @file 目录拷贝
 * @author yanghuning
 */

var fs = require('fs');
var path = require("path");

// 源地址
var origin = path.resolve(__dirname, 'a');
// 目标地址
var target = path.resolve(__dirname, 'b');

/**
 * 递归文件目录
 * @param {String} dirname 
 */ 
function mkdirsSync (dirname) {
  if (fs.existsSync(dirname)) {
    return true;
  } else {
    if (mkdirsSync(path.dirname(dirname))) {
      fs.mkdirSync(dirname);
      return true;
    }
  }
}

/**
 * 复制目录
 * @param {String} src 
 * @param {String} dist 
 */
function _copy (src, dist) {
  var paths = fs.readdirSync(src)
  paths.forEach(function (p) {
    var _src = src + '/' + p;
    var _dist = dist + '/' + p;
    var stat = fs.statSync(_src)
    if (stat.isFile()) {// 判断是文件还是目录
      fs.writeFileSync(_dist, fs.readFileSync(_src));
    } else if (stat.isDirectory()) {
      copyDir(_src, _dist)// 当是目录是,递归复制
    }
  })
}

/*
 * 复制目录、子目录,及其中的文件
 * @param src {String} 要复制的目录
 * @param dist {String} 复制到目标目录
 */
function copyDir (src, dist) {
  var b = fs.existsSync(dist)
  if (!b) {
    mkdirsSync(dist);
  }
  _copy(src, dist);
}

/**
 * 将源目录复制到目标目录
 * @param {String} src 
 * @param {String} dist 
 * @param {Function} callback 
 */
function createDocs (src, dist, callback) {
  copyDir(src, dist);
  if (callback) {
    callback();
  }
}

/**
 * 删除目标路径
 * @param {String} filePath 
 * @param {Function} callback 
 */
function rmdir(filePath, callback) {
  // 先判断当前filePath的类型(文件还是文件夹,如果是文件直接删除, 如果是文件夹, 去取当前文件夹下的内容, 拿到每一个递归)
  fs.stat(filePath, function(err, stat) {
    if(err) {
      if (callback && typeof callback === 'function') callback();
      return;
      // return console.log(err) // 目录为空,暂不处理
    }
    if(stat.isFile()) {
      fs.unlink(filePath, callback)
    }else {
      fs.readdir(filePath, function(err, data) {
        if(err) return console.log(err)
        let dirs = data.map(dir => path.join(filePath, dir))
        let index = 0
        !(function next() {
          // 此处递归删除掉所有子文件 后删除当前 文件夹
          if(index === dirs.length) {
            fs.rmdir(filePath, callback)
          }else {
            rmdir(dirs[index++],next)
          }
        })()
      })
    }
  })
}

// 执行命令 先删除,如果不存在,从源头复制
rmdir(target, function (err) {
  if (!err) {
    createDocs(origin, target, function () {
      console.log('复制完成');
    })
  }
})


发表评论