How do you get a list of the names of all files present in a directory in Node.js?

To get a list of all file/directory names in a directory in Node.js, use the fs (File System) module. Below are methods to achieve this, including filtering for only files (excluding directories):

1. Basic Method: List All Entries (Files + Directories)

Asynchronous (Callback)

const fs = require('fs');
const path = './my-directory';

fs.readdir(path, (err, entries) => {
  if (err) throw err;
  console.log('All entries:', entries); // ["file1.txt", "subdir", "image.png"]
});

Synchronous

const entries = fs.readdirSync('./my-directory');
console.log('All entries:', entries);

Promise-Based (Async/Await)

const { readdir } = require('fs/promises');

async function listEntries() {
  try {
    const entries = await readdir('./my-directory');
    console.log('All entries:', entries);
  } catch (err) {
    console.error(err);
  }
}

listEntries();

2. Filter to Get Only Files (Exclude Directories)

Using withFileTypes (Most Efficient)

Returns Dirent objects to avoid extra filesystem calls:

const { readdir } = require('fs/promises');

async function listFiles() {
  try {
    const entries = await readdir('./my-directory', { withFileTypes: true });
    const files = entries
      .filter(entry => entry.isFile()) // Check if it's a file
      .map(entry => entry.name); // Extract names

    console.log('Files only:', files); // ["file1.txt", "image.png"]
  } catch (err) {
    console.error(err);
  }
}

listFiles();

Using lstatSync (Sync)

Check each entry’s type:

const { readdirSync, lstatSync } = require('fs');
const path = require('path');

const dirPath = './my-directory';
const entries = readdirSync(dirPath);

const files = entries.filter(entry => {
  const fullPath = path.join(dirPath, entry);
  return lstatSync(fullPath).isFile(); // True if it's a file
});

console.log('Files only:', files);

Key Notes

  • Hidden Files: Entries starting with . (e.g., .gitignore) are included. Filter them out if needed:
  entries.filter(entry => !entry.startsWith('.'));
  • Performance: Use withFileTypes to avoid extra stat calls.
  • Error Handling: Always handle errors (e.g., directory not found).

Full Example (Async/Await)

const { readdir } = require('fs/promises');
const path = require('path');

async function listFiles(dirPath) {
  try {
    const entries = await readdir(dirPath, { withFileTypes: true });
    const files = entries
      .filter(entry => entry.isFile())
      .map(entry => entry.name);

    return files;
  } catch (err) {
    console.error('Error reading directory:', err);
    return [];
  }
}

// Usage
listFiles('./my-directory').then(files => {
  console.log('Files:', files);
});

Summary

  • Use fs.readdir or fs.readdirSync to list all entries.
  • Add { withFileTypes: true } and filter with isFile() to exclude directories.
  • Always handle errors gracefully.

Leave a Reply

Your email address will not be published. Required fields are marked *