web-dev-qa-db-ja.com

fs.readdirはディレクトリを無視します

フォルダをスキャンしたいのですが、そこに含まれているすべてのフォルダ/ディレクトリを無視します。 (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');
         }
       })
     })
10
Tony

使用する - fs.readdir または fs.readdirSync オプション付きのメソッド{ withFileTypes: true }次に、 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
});
20
diralik

dirariaの回答はより完全なので、参照してください。私の回答は、すべてのファイル名に「.txt」拡張子が含まれている場合にのみ機能します。

「.txt」で終わるファイルを除外しないのはなぜですか?

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

これらのファイルの配列を取得するには、以下に示すようにそれらを配列に戻す必要があることを以前に追加しておく必要があります。

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