const fs = require('fs')
const path = require('path')
// readdir promise处理
function asyncReaddir(filePath) {
return new Promise((resolve, reject) => {
fs.readdir(filePath, (err, file) => {
if (err) {
reject(err);
}
resolve(file)
})
})
}
// statpromise处理
function asyncStat(filedir) {
return new Promise((resolve, reject) => {
fs.stat(filedir, (err, stats) => {
if (err) reject(err);
resolve(stats)
})
})
}
function fileDispaly(filePath, callback) {
// 读取filePath路径下所有文件和文件夹名称
return asyncReaddir(filePath).then(files => {
let promistList = files.map((fileName) => {
let childFilePath = path.join(filePath, fileName) // 获得子文件的绝对路径
// map遍历会得到多个promise,映射成新的promise数组promistList, 之后用Promise.all处理多个promise
return asyncStat(childFilePath).then(fileInfo => { // 获取每个文件或文件夹的信息
if (fileInfo.isFile()) { // 判断是否是文件
callback && callback(childFilePath) // 是文件则执行回调函数,这里演示接受文件绝对路径
}
if (fileInfo.isDirectory()) {
return fileDispaly(childFilePath, callback) // 递归处理文件夹
}
}).catch(err => {
console.log(err)
})
})
return Promise.all(promistList) // 所有的promise处理完成
}).catch((err) => {
console.log(err)
})
}
// 定义callback, 处理接受到每个文件
let fileList = []
function addFile(file) {
if(file.indexOf('.json')===-1)return
fileList.push(file)
}
// 用D:/test 文件夹做测试
const filePath = path.resolve('./')
fileDispaly(filePath, addFile).then(() => {
// 这里可以对filePath下所有文件做处理了,如计算各个文件类型的数量 或统计文件信息等等
// console.log(fileList)
// 将所有文件路径写入path.txt里
let dataStr = {}
fileList.forEach(item => {
// 读取文件内容
let data = fs.readFileSync(item,"utf-8")
console.log(data)
data = JSON.parse(data)
Object.assign(dataStr, data)
})
dataStr = JSON.stringify(dataStr)
fs.writeFile('最后生成结果.txt', dataStr, (err) => {
if (err) {
console.log("写入文件失败")
} else {
console.log('写入成功')
}
})
})
- 本文作者: MrRetro博客
- 本文链接: http://mrretro.gitee.io/retroblog/retroblog/2022/04/21/node获取文件夹下的所有json并将其合并输出/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!