使用 Node FS 获取包含字符串的文件夹中的所有文件,将文件名推送到数组和 return 数组

Get all files within a folder containing string, push filenames to array and return array using Node FS

如标题所述,我想读取特定目录中的所有文件和 return 内容中包含特定字符串的所有文件的名称。

到目前为止我的代码是这样的:

const dirname = path.resolve("./results/");

async function readFiles(dirname) {
  const allResults = []
  fs.readdir(dirname, function(err, filenames) {
    if (err) {
      console.log(err);
      return;
    }
    filenames.forEach(async function(filename) {
      fs.readFile(dirname + "/" + filename, 'utf-8', function(err, content) {
        if (err) {
          console.log(err);
          return;
        }
        if (content.includes('content string')) {
          allResults.push(filename);
        }
      });
    });
  });
  return allResults;
}
readFiles(dirname).then((res) => {
  console.log(res);
})

我得到的结果是 []

所以我知道这是 promises 和异步函数的问题,然而,这不是我完全掌握的概念,尽管尝试了几种可能性的组合(new Promise(),或 .thenawait,或 readdirSyncreadFileSync) 我没有成功。

我错过了什么,所以它 return 仅在读取所有文件后才成为 allResults 数组?

您应该放弃回调语法并使用 fs.promises Api。这看起来干净多了

const fs = require("fs").promises;
const path = require("path");
const dirname = path.resolve("./results/");


async function readDir(dirname) {
  const allResults = [];

  try {
    const files = await fs.readdir(dirname);

    for (const fileName of files) {
      try {
        const content = await fs.readFile(`${dirname}/${fileName}`, {
          encoding: "utf-8"
        });

        if (content.includes("content string")) {
          allResults.push(fileName);
        }
      } catch (error) {
        console.log(error.message);
      }
    }

    return allResults;
  } catch (error) {
    console.log(error);
  }
}

readDir(dirname).then(data => {
  console.log(data);
});