Node-读取目录中所有文件的内容以及该目录中的目录

Node- Read the content of all files in a directory and directories inside that directory

我的目录结构如下

|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);
      });
    }
  });
});

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

我怀疑您遇到了涉及的递归问题。这是一个让你开始的例子。

警告。它是同步编写的,以便更容易理解,并且不检查非文件(符号链接、套接字等),但应该走上正确的道路。我还使用字符串插值来构建路径......你应该使用 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)
    });
}

这个 returns 一个文件名的嵌套数组,你应该在阅读之前 flatMap(或使用递归通过结果)

您不能执行此搜索"recursively"。

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');

这段代码可以很好地做到这一点,循环一下:

  let data = [];

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

  return data;
}