使用node.js按顺序读取目录内所有文件的内容

Posted

技术标签:

【中文标题】使用node.js按顺序读取目录内所有文件的内容【英文标题】:Read content of all files inside a directory in order using node.js 【发布时间】:2017-08-02 18:09:39 【问题描述】:

我需要遍历给定目录中的文件,并读取每个文件的内容。像这样:

fs.readdir(dirPath, (err, dir)=>
    for(var i=0; i<dir.length; i++)
        fileName = dir[i];

        console.log("A: "+fileName);
        fs.lstat(dir+"\"+fileName, function(err, stats) 
            console.log("B: "+fileName);
        );
    
  )

以上代码的输出是:

A: B01.txt
A: B02.txt
A: B03.txt
A: B04.txt
A: B05.txt
B: B05.txt
B: B05.txt
B: B05.txt
B: B05.txt
B: B05.txt

虽然我希望输出类似于:

A: B01.txt
B: B01.txt
A: B02.txt
B: B02.txt
... etc

如何按顺序循环遍历目录的每个文件并以正确的方式读取它?

编辑

我更新了我的代码以使用statSyn,如下,以及添加读取文件内容代码:

let  content = "";
fs.readdir(dirPath, (err, dir)=>
    for(var i=0; i<dir.length; i++)
        let fileName = dir[i];
        let filePath=dirPath+"/"+fileName;
        console.log("A: "+fileName);
        stat = fs.statSync(filePath);
        if(stat.isFile())
            console.log("B: "+fileName);
            fs.readFile(filePath, 'utf8', function (err,data) 
                if (err) 
                    console.log(err);
                
                console.log("C: "+ fileName);
                mainWindow.webContents.send('getContent' , msg:data);
            );
        
    
)

现在我得到以下结果,请注意“C”行:

A: B01.txt
B: B01.txt
A: B02.txt
B: B02.txt
A: B03.txt
B: B03.txt
A: B04.txt
B: B04.txt
A: B05.txt
B: B05.txt
C: B01.txt
C: B05.txt
C: B02.txt
C: B03.txt
C: B04.txt

我设法读取了所有文件,但不是按顺序。如何确保按顺序阅读?

修复

我最终使用fs.statSyncfs.readFileSync 按顺序读取文件。更不用说使用 let 了。感谢@x-ray 和@Skabbi 的帮助。

【问题讨论】:

【参考方案1】:

fs.lstat 是一个异步函数。您可以改用fs.lstatSync 来获得所需的行为。

【讨论】:

我可以在 lstatSync 中使用回调函数吗? 不,你可以直接使用它的返回值(var stats = fs.lstat(dir+"\"+fileName);)。查看文档:nodejs.org/api/fs.html#fs_fs_lstatsync_path 我使用了statSync,但它似乎只给了我第一个文件的内容!【参考方案2】:

你得到了输出

B: B05.txt

一遍又一遍似乎是一个简单的范围界定问题。

尝试使用“let fileName”。

【讨论】:

我试过 let fileName,它似乎让事情变得更好,但我得到的文件名不按顺序(C:B01.txt,C:B05.txt,C:B02.txt,. .), (请检查我上面的更新)。有没有办法读取每个文件 似乎又是一个范围界定问题。确保在声明变量时始终使用“let”或“const”。 如果订单很重要,你可以试试readfilesync 我已经在编辑部分修复了上面的代码。你能检查一下有什么问题吗? 我需要读取文件并从中提取数据,并将数据处理并存储到输出文件中。排序数据在这里很重要。至于环境是桌面应用程序,所以我猜使用同步很好:)。

以上是关于使用node.js按顺序读取目录内所有文件的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js 顺序读取 csv 文件(使用流 API)

在 node.js 中读取文件和读取目录

Node.js文件系统路径的操作函数

Node.js文件系统路径的操作函数

Node.js文件系统(fs模块的使用)

Node.js同时读取和写入流到同一个文件