egg实现文件搬运与生成目录

本文介绍了如何使用Egg.js实现文件系统的操作,特别是整个文件夹的复制功能。通过fs.cp方法,结合path模块处理路径问题,详细阐述了在Windows和Linux系统下正确拼接路径的方法,并提到了在处理symlink时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

egg实现文件系统

1.egg.js实现整个文件夹的复制(与koaexpress稍有不同点)

node最新版16以上提供了个方法为fs.cp可以直接复制整个文件夹 ,由于我的版本只有14、故用了传统的循环复制方法

需求:假如需要将public目录下面的文件夹要复制到public目录下面的另外一个文件夹

首先需要引入awaitWriteStreamsendToWormhole

npm install stream-wormhole
npm install await-stream-ready

文件中引入

const path = require("path")
const fs = require("fs")
const sendToWormhole = require("stream-wormhole")
const awaitWriteStream = require("await-stream-ready").write

这里给需要生成的文件夹根据用户userId日期date来命名

async optFileSystem(){
    const {ctx} = this
    const req = ctx.query    //获取前段传过来的参数  这里用的是get请求 格式为 req={date:xxxx-xx-xx,userId:xx}
    const src_path = path.join(__dirname, `../public/${req.date}`)	//源路径
    const dist_path = path.join(__dirname, `../public/volumn/userId-${req.userId}/${req.date}`)  //目标路径

    //查看源路径是否存在
    if (!fs.existsSync(src_path) && !fs.statSync(src_path).isDirectory) {
        ctx.response.err("文件位置异常")  //自己封装的response
        return
	}
    //接下来查看目标文件是否存在 不存在则递归创建目录
    await this.mkdirFile(dist_path)
}

接递归创建目录的方法

/**
* 	递归创建目录
* 	@param {*} dirname 路径
* 	@returns
*/	
async mkdirFile(dirname) {
   if (fs.existsSync(dirname)) {
     return true
   } else {
     if (this.mkdirFile(path.dirname(dirname))) {
       fs.mkdirSync(dirname)
       return true
     }
  }
 }

继续在optFileSystem写入(egg.js推荐使用第一种方法)

注意:read的路径拼接中,如果不使用path模块,手动去拼接 如 ${srcPath}/${item} 一定要区分windowslinux系统,前面的是linux的写法,在windows系统下面会报错, windows真正的写法是${srcPath}\\${item}

//method1——> 开始循环读取源文件中的文件并且复制到目标文件下
fs.readdirSync(src_path).forEach(async (item) => {
        const read = fs.createReadStream(path.join(srcPath, item))
        const write = fs.createWriteStream(path.join(distPath, item))
        try {
          awaitWriteStream(read.pipe(write))
        } catch (err) {
          await sendToWormhole(read)  //如果写入失败则释放所有流
          throw err
        }
})
ctx.response.suc({}, "成功")


//method2——> 如果是小文件 在循环中可以用这种方法
const read = path.join(srcPath, item)
const write = path.join(distPath, item)
fs.copyFileSync(read, write)  


//method3——> 以上方法都是一个一个文件的读取和写入,此外还有一种方法是可以让所有文件同步读取和写入
const promise = require("fs/promises")
const promiseArr = new Array(0)
promiseArr.push(promise.copyFile(path.join(srcPath, item), path.join(distPath, item)))//在循环中写入
await Promise.all(promiseArr) //在循环外追加

另外 egg.js对于普通node.js中的管道操作有一定的不友好性

之后的效果**

[外链图片转存中…(img-hC26hYI9-1638765443958)]

另外 egg.js对于普通node.js中的管道操作有一定的不友好性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值