egg实现文件系统
1.egg.js实现整个文件夹的复制(与koa和express稍有不同点)
node最新版16以上提供了个方法为fs.cp可以直接复制整个文件夹 ,由于我的版本只有14、故用了传统的循环复制方法
需求:假如需要将public目录下面的文件夹要复制到public目录下面的另外一个文件夹中
首先需要引入awaitWriteStream和sendToWormhole
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} 一定要区分windows和linux系统,前面的是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中的管道操作有一定的不友好性
本文介绍了如何使用Egg.js实现文件系统的操作,特别是整个文件夹的复制功能。通过fs.cp方法,结合path模块处理路径问题,详细阐述了在Windows和Linux系统下正确拼接路径的方法,并提到了在处理symlink时的注意事项。
2480

被折叠的 条评论
为什么被折叠?



