Node.js Fundamentals
Course 1 · Chapter 5 · File System Operations
📁 File System Operations
Node.js provides the fs (File System) module to interact with files and directories. You can read, write, delete, and manipulate files. This chapter covers reading files, writing files, working with directories, using async/await with the promises API, and common patterns for file operations.
📖 The fs Module
The fs module is built into Node.js. Import it to access file operations:
const fs = require('fs');
const { promises: fsp } = require('fs');
import { promises as fs } from 'fs';
The fs module provides three ways to work with files:
Synchronous (Blocking)
readFileSync(), writeFileSync() — blocks execution. Avoid in production!
Callback (Old)
readFile(), writeFile() with callback — harder to use.
Promises (Modern)
fs.promises.readFile() — returns promise, works with async/await.
Streams
For large files — efficient memory usage (we'll cover later).
📚 Reading Files
Read Text File (Async/Await)
const { promises: fs } = require('fs');
async function readTextFile(filename) {
try {
const content = await fs.readFile(filename, 'utf8');
console.log('File content:', content);
return content;
} catch (error) {
console.error('Error reading file:', error.message);
}
}
await readTextFile('data.txt');
Read as Buffer (Binary Data)
const data = await fs.readFile('image.png');
console.log('Buffer length:', data.length);
✍️ Writing Files
Write Text (Creates or Overwrites)
async function writeFile(filename, content) {
try {
await fs.writeFile(filename, content, 'utf8');
console.log('✓ File written');
} catch (error) {
console.error('Error writing file:', error.message);
}
}
await writeFile('output.txt', 'Hello, World!');
Append to File
async function appendFile(filename, content) {
await fs.appendFile(filename, content, 'utf8');
console.log('✓ Content appended');
}
await appendFile('log.txt', '\nNew log entry');
📂 Directory Operations
List Files in Directory
async function listFiles(dirname) {
try {
const files = await fs.readdir(dirname);
console.log('Files:', files);
return files;
} catch (error) {
console.error('Error reading directory:', error.message);
}
}
await listFiles('./data');
Create Directory
async function createDir(dirname) {
await fs.mkdir(dirname, { recursive: true });
console.log('✓ Directory created');
}
await createDir('./output/subdir');
ℹ️ File Information
async function getFileStats(filename) {
const stats = await fs.stat(filename);
console.log('File size:', stats.size, 'bytes');
console.log('Is file?', stats.isFile());
console.log('Is directory?', stats.isDirectory());
console.log('Modified:', stats.mtime);
}
await getFileStats('data.txt');
🗑️ Deleting Files & Directories
await fs.unlink('old-file.txt');
await fs.rmdir('./empty-dir');
await fs.rm('./dir-with-files', { recursive: true });
🔄 Common Patterns
Process JSON File
async function loadConfig(filename) {
const json = await fs.readFile(filename, 'utf8');
const config = JSON.parse(json);
return config;
}
const config = await loadConfig('config.json');
Copy File
async function copyFile(src, dest) {
const content = await fs.readFile(src);
await fs.writeFile(dest, content);
console.log('✓ File copied');
}
await copyFile('original.txt', 'backup.txt');
💻 Coding Challenges
Challenge 1: Read & Process Text File
Read a text file, count lines/words, and write statistics to a new file.
Goal: Practice reading files and basic text processing.
→ Solution
Challenge 2: JSON Config Management
Read a JSON config file, modify values, and write it back. Handle missing files gracefully.
Goal: Work with JSON files and error handling.
→ Solution
Challenge 3: Directory Operations
List all files in a directory, filter by extension, and generate a file report.
Goal: Master directory reading and file metadata.
→ Solution
💡 File I/O Best Practices
1. Always use async/await: Never use synchronous file operations in production code.
2. Handle errors: Files might not exist, disk might be full, permissions might be denied.
3. Use streams for large files: Reading a 10GB file into memory is a bad idea!
4. Consider paths carefully: Use path.join() for cross-platform compatibility.
🎯 What's Next
Now that you can read and write files, we'll explore HTTP Servers — using Node.js to create web servers and handle HTTP requests.