Working with Directories
Just as you organize your documents in folders on your computer, in Node.js you'll need to create, read, and delete directories. The File System module provides all the tools you need to work with directories.
Working with Directories in Node.js
The fs module provides methods to:
- Create directories (`fs.mkdir`)
- Read directory contents (`fs.readdir`)
- Remove directories (`fs.rmdir`, `fs.rm`)
- Check if a path is a directory (`fs.stat`)
Think of directories as filing cabinets. `mkdir` creates a new cabinet, `readdir` opens it to see what's inside, and `rmdir` throws the whole cabinet away.
1. Creating Directories (mkdir)
Create a single directory:
const fs = require('fs');
fs.mkdir('myfolder', (err) => { if (err) { console.error('Error creating directory:', err); return; } console.log('Directory created successfully');});Create nested directories (with recursive option):
<!-- Without recursive: fails if parent doesn't exist -->fs.mkdir('parent/child/grandchild', { recursive: true }, (err) => { if (err) { console.error(err); return; } console.log('Nested directories created');});Using promises:
const fs = require('fs').promises;
async function createFolders() { try { await fs.mkdir('project/src', { recursive: true }); console.log('Project folders created'); } catch (err) { console.error('Error:', err); }}
createFolders();2. Reading Directories (readdir)
Get a list of all files and subdirectories in a directory.
fs.readdir('.', (err, files) => { if (err) { console.error('Error reading directory:', err); return; } console.log('Files in current directory:'); files.forEach(file => { console.log(' -', file); });});Get file details (with fs.stat):
const fs = require('fs').promises;
async function listFilesWithInfo() { try { const files = await fs.readdir('.'); for (const file of files) { const stats = await fs.stat(file); const type = stats.isDirectory() ? '📁' : '📄'; console.log(`${type} ${file} (${stats.size} bytes)`); } } catch (err) { console.error('Error:', err); }}
listFilesWithInfo();3. Removing Directories
Remove empty directory (rmdir):
fs.rmdir('empty-folder', (err) => { if (err) { console.error('Error removing directory:', err); return; } console.log('Directory removed');});Remove directory with contents (rm - Node.js v14+):
<!-- Remove directory and all its contents -->fs.rm('project', { recursive: true, force: true }, (err) => { if (err) { console.error(err); return; } console.log('Project folder removed');});4. Checking if a Path is a Directory
Use `fs.stat()` to check if a path is a file or directory.
const fs = require('fs').promises;
async function checkPath(path) { try { const stats = await fs.stat(path); if (stats.isDirectory()) { console.log(`${path} is a directory`); } else if (stats.isFile()) { console.log(`${path} is a file`); } } catch (err) { console.log(`${path} does not exist`); }}
checkPath('myfolder');5. Renaming Directories
fs.rename('old-folder', 'new-folder', (err) => { if (err) { console.error(err); return; } console.log('Folder renamed');});6. Practical Example: Project Scaffolding
Create a basic project structure automatically.
const fs = require('fs').promises;const path = require('path');
async function createProject(projectName) { try { <!-- Create main project folder --> await fs.mkdir(projectName); <!-- Create subfolders --> await fs.mkdir(path.join(projectName, 'src')); await fs.mkdir(path.join(projectName, 'tests')); await fs.mkdir(path.join(projectName, 'docs')); <!-- Create a README file --> const readmeContent = `# ${projectName}nnThis is my new project!`; await fs.writeFile(path.join(projectName, 'README.md'), readmeContent); console.log(`Project '${projectName}' created successfully!`); } catch (err) { console.error('Error creating project:', err); }}
createProject('my-awesome-app');Two Minute Drill
- Use `fs.mkdir()` with `recursive: true` to create nested directories.
- Use `fs.readdir()` to list directory contents.
- Use `fs.stat()` to check if a path is a file or directory.
- Use `fs.rmdir()` for empty directories, `fs.rm()` for directories with contents.
- Combine with `path` module for cross-platform paths.
- Use promises API for cleaner async code.
Need more clarification?
Drop us an email at career@quipoinfotech.com
