因为工作需要我们将实现一版使用 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('复制完成');
})
}
})

发表评论