← Back to Node.js Menu | 🏠 Hub
const fs = require('fs');
const path = require('path');
// Async (non-blocking) — PREFER this
fs.readFile('data.txt', 'utf8', (err, content) => {
if (err) { console.error(err); return; }
console.log(content);
});
// Promise-based (modern — cleanest)
const { readFile, writeFile, mkdir, rm } = require('fs/promises');
async function readData() {
try {
const content = await readFile('data.txt', 'utf8');
console.log(content);
} catch (err) {
console.error('File not found:', err.message);
}
}
// Sync (blocking — avoid in server code!)
const content = fs.readFileSync('data.txt', 'utf8');
console.log(content);
// Read JSON file
const config = JSON.parse(fs.readFileSync('config.json', 'utf8'));
const { writeFile, appendFile } = require('fs/promises');
// Write (creates or overwrites)
await writeFile('output.txt', 'Hello World!\n', 'utf8');
// Write JSON
const data = { users: [{name: 'Ko', age: 25}] };
await writeFile('data.json', JSON.stringify(data, null, 2));
// Append (add to end)
await appendFile('log.txt', `[${new Date().toISOString()}] User login\n`);
// Write binary (e.g., image)
const imageBuffer = await readFile('photo.jpg');
await writeFile('photo_copy.jpg', imageBuffer);
const { mkdir, readdir, rm, rename, copyFile, stat } = require('fs/promises');
// Create directory
await mkdir('uploads', { recursive: true }); // recursive = no error if exists
// List files
const files = await readdir('uploads');
console.log(files); // ['file1.jpg', 'file2.pdf', ...]
// Filter by type
const items = await readdir('.', { withFileTypes: true });
const dirs = items.filter(i => i.isDirectory()).map(i => i.name);
const jsFiles = items.filter(i => i.isFile() && i.name.endsWith('.js'));
// File info
const info = await stat('app.js');
console.log(info.size); // bytes
console.log(info.mtime); // last modified
console.log(info.isFile()); // true
console.log(info.isDirectory()); // false
// Rename / Move
await rename('old.txt', 'new.txt');
await rename('file.txt', 'folder/file.txt'); // move!
// Copy
await copyFile('source.txt', 'backup.txt');
// Delete
await rm('temp.txt');
await rm('uploads/', { recursive: true }); // delete folder
const path = require('path');
// Problem: Windows uses \ but Mac/Linux uses /
// path.join solves this!
// ❌ Don't concatenate strings
const bad = __dirname + '/uploads/' + filename; // breaks on Windows
// ✅ Use path.join
const good = path.join(__dirname, 'uploads', filename);
// Windows: C:\project\uploads\file.jpg
// Linux: /project/uploads/file.jpg
// path examples
path.join('src', 'app', 'index.js'); // src/app/index.js
path.resolve('src', 'app.js'); // absolute path
path.basename('/home/user/file.txt'); // file.txt
path.extname('photo.jpg'); // .jpg
path.dirname('/home/user/file.txt'); // /home/user
// __dirname in action
const uploadsDir = path.join(__dirname, '..', 'uploads'); // one level up
const configFile = path.join(__dirname, 'config', 'app.json');
const fs = require('fs');
// Watch a file
fs.watch('data.txt', (eventType, filename) => {
console.log(`${filename} changed — event: ${eventType}`);
// eventType: 'rename' (created/deleted) | 'change' (modified)
});
// Watch a directory
fs.watch('src/', { recursive: true }, (event, filename) => {
console.log(`Change in src/: ${filename}`);
});
// Practical: simple file-based logger
const { appendFile } = require('fs/promises');
async function log(level, message) {
const entry = JSON.stringify({
time: new Date().toISOString(),
level,
message
}) + '\n';
await appendFile('app.log', entry);
console.log(`[${level.toUpperCase()}] ${message}`);
}
await log('info', 'Server started on port 3000');
await log('error', 'Database connection failed');
← Node.js 02 | Next: Node.js 04 → Express →