← Back to Examples

File System Module

The fs module provides methods for interacting with the file system. These are Node.js code references.

Save these as .js files and run with node filename.js to test them.

1. Reading Files

// read-files.js const fs = require('fs'); const fsPromises = require('fs/promises'); // ======================================== // METHOD 1: Synchronous (Blocking) // ======================================== try { const data = fs.readFileSync('sample.txt', 'utf-8'); console.log('Sync read:', data); } catch (err) { console.error('Error reading file:', err.message); } // ======================================== // METHOD 2: Callback (Non-blocking) // ======================================== fs.readFile('sample.txt', 'utf-8', (err, data) => { if (err) { console.error('Callback error:', err.message); return; } console.log('Callback read:', data); }); // ======================================== // METHOD 3: Promise-based (Modern - Recommended!) // ======================================== async function readFileAsync() { try { const data = await fsPromises.readFile('sample.txt', 'utf-8'); console.log('Async read:', data); } catch (err) { console.error('Async error:', err.message); } } readFileAsync(); // Read as Buffer (binary data) async function readBinary() { const buffer = await fsPromises.readFile('image.png'); console.log('File size:', buffer.length, 'bytes'); console.log('First bytes:', buffer.slice(0, 10)); }

2. Writing Files

// write-files.js const fs = require('fs/promises'); async function writeExamples() { // Write a new file (creates or overwrites) await fs.writeFile('output.txt', 'Hello, Node.js!\nThis is line 2.'); console.log('File written!'); // Write JSON data const users = [ { id: 1, name: 'Alice', email: 'alice@example.com' }, { id: 2, name: 'Bob', email: 'bob@example.com' } ]; await fs.writeFile('users.json', JSON.stringify(users, null, 2)); console.log('JSON file written!'); // Append to file await fs.appendFile('output.txt', '\nAppended line 3!'); console.log('Content appended!'); // Read back to verify const content = await fs.readFile('output.txt', 'utf-8'); console.log('File contents:\n' + content); } writeExamples().catch(console.error);

3. Directory Operations

// directories.js const fs = require('fs/promises'); const path = require('path'); async function directoryOperations() { // Create a directory await fs.mkdir('test-dir', { recursive: true }); console.log('Directory created!'); // Create nested directories await fs.mkdir('projects/web/src', { recursive: true }); console.log('Nested directories created!'); // Create some test files await fs.writeFile('test-dir/file1.txt', 'Content 1'); await fs.writeFile('test-dir/file2.txt', 'Content 2'); await fs.writeFile('test-dir/data.json', '{"key":"value"}'); // List directory contents const files = await fs.readdir('test-dir'); console.log('Files:', files); // ['data.json', 'file1.txt', 'file2.txt'] // List with file type info const entries = await fs.readdir('test-dir', { withFileTypes: true }); for (const entry of entries) { const type = entry.isDirectory() ? 'DIR' : 'FILE'; const ext = path.extname(entry.name); console.log(` [${type}] ${entry.name} (${ext || 'no ext'})`); } // Get file statistics const stats = await fs.stat('test-dir/file1.txt'); console.log('File stats:', { size: stats.size + ' bytes', created: stats.birthtime.toLocaleString(), modified: stats.mtime.toLocaleString(), isFile: stats.isFile(), isDirectory: stats.isDirectory() }); // Check if path exists try { await fs.access('test-dir'); console.log('test-dir exists!'); } catch { console.log('test-dir does not exist'); } // Clean up - remove directory and contents await fs.rm('test-dir', { recursive: true }); await fs.rm('projects', { recursive: true }); console.log('Cleaned up!'); } directoryOperations().catch(console.error);

4. File Copy and Move

// copy-move.js const fs = require('fs/promises'); async function copyAndMove() { // Create a source file await fs.writeFile('source.txt', 'Original content'); // Copy file await fs.copyFile('source.txt', 'copy.txt'); console.log('File copied!'); // Rename/Move file await fs.rename('copy.txt', 'renamed.txt'); console.log('File renamed!'); // Verify const content = await fs.readFile('renamed.txt', 'utf-8'); console.log('Content:', content); // Delete files await fs.unlink('source.txt'); await fs.unlink('renamed.txt'); console.log('Files deleted!'); } copyAndMove().catch(console.error);

5. Path Module

// path-demo.js const path = require('path'); // Join path segments safely const filePath = path.join('/users', 'alice', 'documents', 'report.pdf'); console.log('Joined:', filePath); // /users/alice/documents/report.pdf // Resolve to absolute path const absolute = path.resolve('src', 'index.js'); console.log('Resolved:', absolute); // /full/path/to/project/src/index.js // Get parts of a path console.log('Directory:', path.dirname(filePath)); // /users/alice/documents console.log('Filename:', path.basename(filePath)); // report.pdf console.log('Extension:', path.extname(filePath)); // .pdf console.log('Name only:', path.basename(filePath, '.pdf')); // report // Parse path into object const parsed = path.parse('/home/user/docs/file.txt'); console.log('Parsed:', parsed); // { root: '/', dir: '/home/user/docs', // base: 'file.txt', ext: '.txt', name: 'file' } // Normalize messy paths console.log(path.normalize('/foo/bar//baz/../qux')); // /foo/bar/qux
Always use path.join() instead of string concatenation:
// BAD - breaks on Windows const bad = __dirname + '/data/' + filename; // GOOD - works everywhere const good = path.join(__dirname, 'data', filename);

6. Practical Example: Simple Logger

// logger.js const fs = require('fs/promises'); const path = require('path'); class FileLogger { constructor(logDir = 'logs') { this.logDir = logDir; this.initialized = false; } async init() { await fs.mkdir(this.logDir, { recursive: true }); this.initialized = true; } getLogFile() { const date = new Date().toISOString().split('T')[0]; return path.join(this.logDir, `${date}.log`); } async log(level, message) { if (!this.initialized) await this.init(); const timestamp = new Date().toISOString(); const line = `[${timestamp}] [${level.toUpperCase()}] ${message}\n`; await fs.appendFile(this.getLogFile(), line); } async info(msg) { await this.log('INFO', msg); } async warn(msg) { await this.log('WARN', msg); } async error(msg) { await this.log('ERROR', msg); } async readLogs(date) { const file = date ? path.join(this.logDir, `${date}.log`) : this.getLogFile(); try { return await fs.readFile(file, 'utf-8'); } catch { return 'No logs found for this date.'; } } } // Usage async function main() { const logger = new FileLogger(); await logger.info('Application started'); await logger.info('User logged in: alice'); await logger.warn('Disk space running low'); await logger.error('Database connection failed'); const logs = await logger.readLogs(); console.log(logs); } main().catch(console.error);

← Back to Examples