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