要递归获取E盘media文件夹下的所有文件
开始时,我用了nodejs中异步的方法 【fs.readdir()和fs.stat()都是异步】(vue中写的,下面是主要代码)
const fs = require('fs');
const path = require("path");
created(){
this.getPath()
},
methods:{
readDirectory(pathName,dirs=[]){
//fs.readdir读取文件目录
fs.readdir(pathName, (err, files)=>{
files.forEach((item,index)=>{
fs.stat(path.join(pathName, item), (err, data)=>{
if(data.isDirectory()){
this.readDirectory(path.join(pathName, item),dirs)
}else if(data.isFile()){
dirs.push(path.join(pathName, item))
}
});
})
});
return dirs
},
getPath(){
let filePaths = this.readDirectory('E:\media')//'E:\media' 是通过electron获取的
console.log(filePaths) //[] 展开才有数据(其实是空的)
console.log(JSON.stringify(filePaths)) //[]
}
}
输出了空数组,为什么?
首先牢记nodejs单线程,非阻塞的特点。fs.readdir()和fs.stat()都是异步执行。console.log()执行时,可能fs.stat()的回调函数尚未执行完毕,所以输出了空数组。
修改上述代码,改异步为同步,可以得到想要结果。【fs.readdirSync()和fs.lstatSync()都是同步方法】
const fs = require('fs');
const path = require("path");
created(){
this.getPath()
},
methods:{
readDirectory(pathName,dirs=[]){
//异步读取文件夹
fs.readdirSync(pathName).forEach((item,index)=>{
//异步处理路径
let stat = fs.lstatSync(path.join(pathName, item))
if(stat.isDirectory()){
this.readDirectory(path.join(pathName, item),dirs)
}else if(stat.isFile()){
dirs.push(path.join(pathName, item))
}
})
return dirs
},
getPath(){
let filePaths = this.readDirectory('E:\media')//'E:\media' 是通过electron获取的
console.log(filePaths) //输出结果如下图
console.log(JSON.stringify(filePaths)) //输出结果如下图
}
}
输出结果如下
参考文献
https://blog.csdn.net/liyazhen2011/article/details/87342769