← 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
const fs = require('fs');
const fsPromises = require('fs/promises');
try {
const data = fs.readFileSync('sample.txt', 'utf-8');
console.log('Sync read:', data);
} catch (err) {
console.error('Error reading file:', err.message);
}
fs.readFile('sample.txt', 'utf-8', (err, data) => {
if (err) {
console.error('Callback error:', err.message);
return;
}
console.log('Callback read:', data);
});
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();
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
const fs = require('fs/promises');
async function writeExamples() {
await fs.writeFile('output.txt', 'Hello, Node.js!\nThis is line 2.');
console.log('File written!');
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!');
await fs.appendFile('output.txt', '\nAppended line 3!');
console.log('Content appended!');
const content = await fs.readFile('output.txt', 'utf-8');
console.log('File contents:\n' + content);
}
writeExamples().catch(console.error);
3. Directory Operations
const fs = require('fs/promises');
const path = require('path');
async function directoryOperations() {
await fs.mkdir('test-dir', { recursive: true });
console.log('Directory created!');
await fs.mkdir('projects/web/src', { recursive: true });
console.log('Nested directories created!');
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"}');
const files = await fs.readdir('test-dir');
console.log('Files:', files);
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'})`);
}
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()
});
try {
await fs.access('test-dir');
console.log('test-dir exists!');
} catch {
console.log('test-dir does not exist');
}
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
const fs = require('fs/promises');
async function copyAndMove() {
await fs.writeFile('source.txt', 'Original content');
await fs.copyFile('source.txt', 'copy.txt');
console.log('File copied!');
await fs.rename('copy.txt', 'renamed.txt');
console.log('File renamed!');
const content = await fs.readFile('renamed.txt', 'utf-8');
console.log('Content:', content);
await fs.unlink('source.txt');
await fs.unlink('renamed.txt');
console.log('Files deleted!');
}
copyAndMove().catch(console.error);
5. Path Module
const path = require('path');
const filePath = path.join('/users', 'alice', 'documents', 'report.pdf');
console.log('Joined:', filePath);
const absolute = path.resolve('src', 'index.js');
console.log('Resolved:', absolute);
console.log('Directory:', path.dirname(filePath));
console.log('Filename:', path.basename(filePath));
console.log('Extension:', path.extname(filePath));
console.log('Name only:', path.basename(filePath, '.pdf'));
const parsed = path.parse('/home/user/docs/file.txt');
console.log('Parsed:', parsed);
console.log(path.normalize('/foo/bar//baz/../qux'));
Always use path.join() instead of string concatenation:
const bad = __dirname + '/data/' + filename;
const good = path.join(__dirname, 'data', filename);
6. Practical Example: Simple Logger
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.';
}
}
}
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