fs.readdir 忽略目录

fs.readdir ignore directories

我想扫描文件夹,但忽略其中包含的所有 folders/directories。我在(C:/folder/)里面只有.txt文件和其他文件夹,我只想扫描txt文件,忽略文件夹。

app.get('/generatE', function (req, res) {
  const logsFolder = 'C:/folder/';
  fs.readdir(logsFolder, (err, files) => {
    if (err) {
      res.send("[empty]");
      return;
     }
     var lines = [];
     files.forEach(function(filename) {
       var logFileLines = fs.readFileSync (logsFolder + filename, 'ascii').toString().split("\n");

       logFileLines.forEach(function(logFileLine) {


         if(logFileLine.match(/.*AUDIT*./)) {
           lines.push(logFileLine+'\n');
         }
       })
     })

请参阅 diralik 的回答,因为它更完整:我的回答仅在所有文件名都包含“.txt”扩展名时有效。

为什么不过滤掉以“.txt”结尾的文件?

var fs = require("fs")
fs.readdirSync("./").filter(function(file) {
    if(file.indexOf(".txt")>-1)console.log(file)
})

我之前应该补充说,要获得这些文件的数组,您需要将它们 return 到一个数组,如下所示。

var fs = require("fs")
let text_file_array = fs.readdirSync("./").filter(function(file) {
    if(file.indexOf(".txt")>-1) return file;
})

使用 fs.readdir or fs.readdirSync method with options { withFileTypes: true } and then do filtration using dirent.isFile(需要 Node 10.10+)。

同步版本

const fs = require('fs');
const dirents = fs.readdirSync(DIRECTORY_PATH, { withFileTypes: true });
const filesNames = dirents
    .filter(dirent => dirent.isFile())
    .map(dirent => dirent.name);
// use filesNames

异步版本(async/await,需要 Node 11+)

import { promises as fs } from 'fs';

async function listFiles(directory) {
    const dirents = await fs.readdir(directory, { withFileTypes: true });
    return dirents
        .filter(dirent => dirent.isFile())
        .map(dirent => dirent.name);
}

异步版本(带回调)

const fs = require('fs');
fs.readdir(DIRECTORY_PATH, { withFileTypes: true }, (err, dirents) => {
    const filesNames = dirents
        .filter(dirent => dirent.isFile())
        .map(dirent => dirent.name);
    // use filesNames
});