Working with Directories
Create, read, and remove folders with the fs module.
Syntax
await fs.mkdir(dir, { recursive: true });The fs module also manages folders (directories):
mkdir— create a folder.readdir— list a folder's contents.rmdir/rm— remove a folder.existsSync— check whether a path exists.
Recursive folders
Pass { recursive: true } to mkdir to create nested folders in one call.
Example
const fs = require('fs/promises');
async function run() {
await fs.mkdir('output/reports', { recursive: true });
await fs.writeFile('output/reports/a.txt', 'hi');
const names = await fs.readdir('output/reports');
console.log('Files:', names); // ['a.txt']
}
run();When to use it
- A scaffolding CLI uses `fs.mkdirSync` with `{ recursive: true }` to create a full project directory tree in one call.
- A log archiver uses `fs.readdir` to list all files in a log directory, then filters by date to delete old ones.
- A deployment script uses `fs.rmSync` with `{ recursive: true, force: true }` to wipe a build output folder before regenerating it.
More examples
Create a directory recursively
Uses `fs.mkdirSync` with `{ recursive: true }` to create nested directories in one call without errors if they exist.
const fs = require('fs');
// Creates all intermediate directories
fs.mkdirSync('./output/reports/2024', { recursive: true });
console.log('Directory created');List directory contents
Reads a directory with `withFileTypes: true` to distinguish files from subdirectories without extra `stat` calls.
const fs = require('fs/promises');
const path = require('path');
async function listFiles(dir) {
const entries = await fs.readdir(dir, { withFileTypes: true });
for (const e of entries) {
console.log(e.isDirectory() ? '[DIR]' : '[FILE]', e.name);
}
}
listFiles('.');Remove a directory tree
Uses `fs.rmSync` with `recursive` and `force` to delete a non-empty directory tree without errors.
const fs = require('fs');
// Node 14.14+ -- removes directory and all contents
fs.rmSync('./dist', { recursive: true, force: true });
console.log('dist/ removed');
Discussion