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
中的管道操作
有一定的不友好性