Nodejs 文件(或目录)复制操作完成后 回调

前言

现在需要实现这样一个功能,将目录a中所有文件及文件夹复制到目录b,并在整个操作完成后,执行一次某个方法,或者一个回调。

有几种方法可以尝试实现上述功能

  1. 遍历目录及文件前,给个计数器,初始值设置在null,文件/目录每读取一个文件,计数器数量增加1(若初始值为null,则直接赋值1),复制完成后数量减少1,每隔某个时间后读取计数器,若计数器不是null并且是0,则表示已经复制完成,调用回调方法。

    这种方法 计数可能会不准

  2. 遍历目录中都使用同步的方法,nodejs中fs库大部分方法都有同步的实现,比如说fs.stat有fs.statSync。在复制完成后执行回调。

    这种方法可能会耗时过长,代码阻塞

另一种方法是使用fs的同步方法+promise.all,同步读取目录,异步处理文件复制,promise.all回调来执行复制文件完成的回调

// copyfile.js
const path = require('path')
const fs = require('fs')

module.exports = function (fromDir, toDir) {
    if (!fromDir || !toDir || fromDir == toDir) {
        return Promise.reject(new Error(`参数无效:${fromDir} - ${toDir}`))
    }
    return new Promise((resolve, reject) => {
        !fs.existsSync(toDir) && fs.mkdirSync(toDir, {recursive: true})
        const task = []
        readFileSync(fromDir, toDir, (fromFullPath, toFullPath, stat) => {
            task.push({
                fromFullPath, toFullPath, stat
            })
        })
        Promise.all(task.map(k => loopCopyFilePromise(k))).then(resolve).catch(e => reject(e))
    })
}


function readFileSync(fromDir, toDir, cb) {
    const method = arguments.callee;
    const fileList = fs.readdirSync(fromDir)
    fileList.forEach((name) => {
        const fromFullPath = path.join(fromDir, name)
        const toFullPath = path.join(toDir, name)
        const stat = fs.statSync(fromFullPath)
        if (stat.isDirectory()) {
            !fs.existsSync(toFullPath) && fs.mkdirSync(toFullPath, {recursive: true})
            method(fromFullPath, toFullPath, cb)
        }
        if (stat.isFile()) {
            cb(fromFullPath, toFullPath, stat)
        }
    })
}

function loopCopyFilePromise(args) {
    const {fromFullPath, toFullPath, stat} = args
    if (stat.size > 10000) {
        return new Promise((resolve, reject) => {
            const readStream = fs.createReadStream(fromFullPath),
                writeStream = fs.createWriteStream(toFullPath)
            readStream.pipe(writeStream)
            writeStream.on('finish', resolve)
            writeStream.on('error', reject)
        })
    } else {
        return new Promise((resolve, reject) => {
            fs.copyFile(fromFullPath, toFullPath, (err) => {
                err ? reject() : resolve();
            });
        })
    }
}

模块返回一个promise,可以直接在then方法加回调

const copyfile = require("。/filecopy")

console.log('start...')
copyfile("./dirA",'./dirB').then(()=>{
	console.log("这里执行回调")
    console.log("end...")
})

有时候会有这样的使用场景,从远程上下载文件到某个临时目录,然后复制到某个指定的目录,最后删除临时目录,此时就需要在文件复制完成后,执行清理工作

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中,你可以使用`fs`模块来复制文件到指定目录。下面是一个简单的示例代码: ```javascript const fs = require('fs'); const path = require('path'); function copyFile(sourcePath, targetPath) { // 构造目标文件路径 const fileName = path.basename(sourcePath); const targetFilePath = path.join(targetPath, fileName); // 创建可读流和可写流 const readStream = fs.createReadStream(sourcePath); const writeStream = fs.createWriteStream(targetFilePath); // 执行文件复制 readStream.pipe(writeStream); // 监听复制完成事件 writeStream.on('finish', () => { console.log('文件复制成功!'); }); // 监听错误事件 writeStream.on('error', (err) => { console.error('文件复制失败:', err); }); } // 使用示例 const sourcePath = '/path/to/source/file.txt'; const targetPath = '/path/to/target/directory'; copyFile(sourcePath, targetPath); ``` 上述代码中,我们首先引入了`fs`和`path`模块。然后定义了一个`copyFile`函数,该函数接受源文件路径和目标目录路径作为参数。 在函数内部,我们使用`path.basename`方法获取源文件文件名,并使用`path.join`方法构造目标文件的完整路径。 接下来,我们使用`fs.createReadStream`创建一个可读流,用于读取源文件的内容。同时,使用`fs.createWriteStream`创建一个可写流,用于将内容写入目标文件。 然后,我们使用`readStream.pipe(writeStream)`将可读流的内容传输到可写流中,实现文件复制。 最后,我们监听可写流的`finish`事件,表示文件复制完成。如果复制过程中发生错误,我们监听可写流的`error`事件,并打印错误信息。 你可以根据实际情况修改源文件路径和目标目录路径,然后调用`copyFile`函数进行文件复制

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值