javascriptnode.jsreaddir

fs.readdir ignore directories


I would like to scan the folder, but ignore all the folders/directories that are included in it. All I have in the (C:/folder/) are .txt files and other folders, I just want to scan the txt files, and ignore the folders.

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

Solution

  • Use fs.readdir or fs.readdirSync method with options { withFileTypes: true } and then do filtration using dirent.isFile (requires Node 10.10+).

    Sync version

    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 version (with async/await, requires 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);
    }
    

    Async version (with callbacks)

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