节点 - 读取目录中所有文件和子目录中的内容

4

我的目录结构如下

|demo
  |abc
    abc.js
    abc.html
  |xyz
    test.js
    test.html
  |images
  pqr.js

我希望能够读取演示库及其子库中每个文件的内容。需要在每个文件中匹配模式,如果成功匹配,则该条目应与文件名一起放入数组中。有什么建议吗?
我尝试了以下代码,但它无法读取子目录中的文件。
var fs=require('fs');

var dir = './demo';
fs.readdir(dir,function(err,files){
  if (err) throw err;
  files.forEach(function(file){
    if(file) {
      fs.readFile('./demo/'+file, 'utf8', function (err,data) {
        if (err) {
          return console.log(err);
        }
        console.log(data);
      });
    }
  });
});

我不想要一个目录的数组。我想要读取目录及其子目录中每个文件的内容,并匹配一个字符串。如果该字符串存在,则将其与文件名一起输入到数组中。


可能是获取nodejs中目录下的所有目录的重复问题。 - undefined
我不想要一个目录数组。我想要读取目录及其子目录中每个文件的内容,并匹配一个字符串。如果字符串存在,则将其与文件名一起输入到一个数组中。 - undefined
1
上面提到的答案清楚地说明了,您可以检查一个文件或目录是否为目录。如果是目录,则可以应用递归函数进入子目录等等。如果您想要匹配字符串,则可以设置一个条件来检查字符串与文件名是否相符。 - undefined
3个回答

3

这段代码可以很好地完成这个任务,让我们来看一下循环:

  let data = [];

  fs.readdirSync("absolute-directory", "utf8").forEach((file) => {
    data.push(fs.readFileSync("absolute-directory" + file, "utf8"));
  });

  return data;
}


2
我猜测您遇到了涉及递归的问题。以下是一个示例,可以帮助您入门。 警告:该示例以同步方式编写,以便更容易理解,并且不检查非文件(符号链接、套接字等),但应该可以找到正确的路径。我还使用字符串插值构建路径……您应该使用path.join
function getFiles(dir) {

    // get all 'files' in this directory
    var all = fs.readdirSync(dir);

    // process each checking directories and saving files
    return all.map(file => {
        // am I a directory?
        if (fs.statSync(`${dir}/${file}`).isDirectory()) {
            // recursively scan me for my files
            return getFiles(`${dir}/${file}`);
        }
        // WARNING! I could be something else here!!!
        return `${dir}/${file}`;     // file name (see warning)
    });
}

这将返回一个嵌套的文件名数组,您应该在读取之前进行flatMap处理(或通过结果进行递归)。

2

您不能以“递归”的方式进行此搜索。

var fs = require('fs');
var path = require('path');

var recursiveSearch = function(directoryPath) {
    fs.readdir(directoryPath, function(err, list) {
        if (err) { return }

        list.forEach(function(file) {
            file = path.resolve(directoryPath, file);

            fs.stat(file, function (err, stat) {
                if (stat && stat.isDirectory()) {
                    recursiveSearch(file);
                } else {
                    fs.readFile(file, function (err, data) {
                        // read file contents here and 
                        console.log(file);
                        console.log(data);
                    })
                }
            })
        })
    })
};


recursiveSearch('C:\\sample_directory');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接