Nodejs按照行递归读取文件的问题

Nodejs按照行递归读取文件的问题

nodejs里面有同步读取文件的,基本的API都带同步方法。 但是确实目前没有按行读入,你可以用流直接切一下,就几行代码,而且流还可以指定字节数读入,比较方便。 或者你用NPM下一个按行读入的。 不过建议还是自己封装一下,灵活点。

2 回复

Node.js 按照行递归读取文件的问题

在Node.js中,处理大文件时按行读取文件是一个常见的需求。虽然Node.js提供了同步读取文件的基本API,但这些API并不支持按行读取。因此,我们可以使用流(Stream)来实现这一功能,或者通过安装第三方模块来简化操作。

使用流(Stream)按行读取文件

流是一种高效的方式来处理数据,特别是对于大文件。我们可以利用fs.createReadStream创建一个可读流,并结合readline模块来逐行读取文件内容。

示例代码:

const fs = require('fs');
const readline = require('readline');

function readLines(filePath) {
    const stream = fs.createReadStream(filePath);
    const lineReader = readline.createInterface({
        input: stream,
        crlfDelay: Infinity
    });

    lineReader.on('line', (line) => {
        console.log(`Line from file: ${line}`);
    });

    lineReader.on('close', () => {
        console.log('File reading completed.');
    });
}

// 调用函数读取文件
readLines('path/to/your/file.txt');

在这个例子中,我们首先通过fs.createReadStream创建一个可读流,然后使用readline.createInterface创建一个接口来读取流中的每一行。每当读取到一行时,会触发'line'事件并打印出来。当所有行都被读取完毕后,会触发'close'事件。

递归读取文件夹中的所有文件

如果需要递归地读取某个目录及其子目录中的所有文件,可以进一步扩展上述代码:

const path = require('path');
const fs = require('fs');
const readline = require('readline');

function readLinesInDir(dirPath) {
    fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
        if (err) throw err;

        files.forEach(file => {
            const fullPath = path.join(dirPath, file.name);
            if (file.isDirectory()) {
                // 如果是文件夹,则递归调用
                readLinesInDir(fullPath);
            } else {
                // 如果是文件,则按行读取
                readLines(fullPath);
            }
        });
    });
}

// 调用函数递归读取文件夹
readLinesInDir('path/to/your/directory');

在这个递归函数中,我们首先列出指定目录下的所有文件和文件夹。如果是文件夹,则递归调用自身;如果是文件,则调用readLines函数按行读取文件内容。

通过这种方式,我们可以高效地按行读取文件,并且能够处理包含多个文件的目录结构。


对于按行递归读取文件的需求,可以使用 Node.js 的 fs 模块中的 createReadStream 方法配合 readline 模块来实现。下面是一个简单的示例代码,演示如何按行读取文件,并且递归处理目录下的所有文件。

示例代码

const fs = require('fs');
const path = require('path');
const readline = require('readline');

function readLines(filePath, callback) {
    const stream = fs.createReadStream(filePath);
    const rl = readline.createInterface({ input: stream });

    rl.on('line', (line) => {
        console.log(line);
    });

    rl.on('close', () => {
        callback();
    });
}

function processDirectory(dirPath) {
    fs.readdir(dirPath, { withFileTypes: true }, (err, files) => {
        if (err) throw err;

        files.forEach(file => {
            const filePath = path.join(dirPath, file.name);
            if (file.isDirectory()) {
                // 如果是目录,则递归处理
                processDirectory(filePath);
            } else if (file.isFile()) {
                // 如果是文件,则按行读取
                readLines(filePath, () => {
                    console.log(`Finished reading ${filePath}`);
                });
            }
        });
    });
}

// 开始处理指定目录
processDirectory('./exampleDir');

解释

  1. 引入模块:首先引入了 fspathreadline 模块。
  2. 定义 readLines 函数:该函数接收一个文件路径和一个回调函数。它通过创建一个读取流并使用 readline 创建接口来逐行读取文件内容,并在每一行上执行回调函数(在这里是打印每一行)。
  3. 定义 processDirectory 函数:该函数接收一个目录路径。它使用 fs.readdir 方法读取目录内容,并对每个文件或子目录进行处理。如果是目录,则递归调用自身;如果是文件,则调用 readLines 函数按行读取文件内容。
  4. 开始处理目录:最后,我们调用 processDirectory 函数,传入需要处理的目录路径。

这样,你就可以实现一个简单的按行递归读取文件的程序了。

回到顶部