使用nodeJS编写脚本,根据文件列表将源目录的目标文件复制到新目录

1 篇文章 0 订阅
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
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值