Nodejs递归读取目录下的所有文件时,获得空数组(nodejs异步方法),以及解决办法(nodejs同步方法)

 要递归获取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

发布了248 篇原创文章 · 获赞 32 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_37899792/article/details/105515919