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 extrastat
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
orfs.readdirSync
to list all entries. - Add
{ withFileTypes: true }
and filter withisFile()
to exclude directories. - Always handle errors gracefully.