const fs = require('fs');
const src_list = 'F:/workspace/front'; // 被复制的源目录
const dst_list = './new_front'; // 复制后的目录
const allowFiles = './all.txt'; // 允许被复制的目标文件列表
/**
* 允许被复制的目标文件列表
*/
let copyFileArr = [];
fs.readFile(allowFiles, function (err, data) {
if (err) {
throw err;
}
copyFileArr = data.toString().split("\n");
copyFileArr = decode(copyFileArr);
// 检索文件并复制到dst_list目录下
exists(src_list, dst_list, copyDir)
})
/**
* 遍历文件名,进行解码
* @param arr 文件列表
*/
const decode = function (arr) {
for (i in arr) {
if (arr[i].indexOf("%") !== -1) {
arr[i] = decodeURIComponent(arr[i])
}
}
return arr
}
/**
* 复制一个文件夹下的文件到另一个文件夹
* @param src 源文件夹
* @param dst 目标文件夹
*/
const copyDir = function (src, dst) {
// 读取目录中的所有文件/目录
fs.readdir(src, function (err, paths) {
if (err) {
throw err
}
paths.forEach(function (path) {
const _src = src + '/' + path
const _dst = dst + '/' + path
let readable; let writable
fs.stat(_src, function (err, st) {
if (err) {
throw err
}
// 判断是否为文件
if (st.isFile()) {
// 文件名符合的文件才可以被复制
if (contains(copyFileArr, _src)) {
// 创建读取流
readable = fs.createReadStream(_src)
// 创建写入流
writable = fs.createWriteStream(_dst)
// 通过管道来传输流
readable.pipe(writable)
} else {
// console.log(_src + ' 不允许被复制!!!')
}
}
// 如果是目录则递归调用自身
else if (st.isDirectory()) {
exists(_src, _dst, copyDir)
}
})
})
})
}
/**
* 在复制目录前需要判断目标目录是否存在,
* 不存在需要先创建目录
* @param src
* @param dst
* @param callback
*/
const exists = function (src, dst, callback) {
if (fs.existsSync(dst)) {
callback(src, dst)
} else {
fs.mkdir(dst, function () {
callback(src, dst)
})
}
}
/**
* 判断数组中的元素是否包含此字符串
* @param arr
* @param obj
* @returns {boolean}
*/
const contains = function (arr, obj) {
let flag = false
obj = obj.replace(src_list, "")
flag = arr.some(i => i === obj);
return flag
}
使用nodeJS编写脚本,根据文件列表将源目录的目标文件复制到新目录
最新推荐文章于 2024-05-29 09:50:16 发布