🏠 Home / Hub

🟢 Node.js Lesson 03 — File System (fs)

← Back to Node.js Menu  |  🏠 Hub

1. Read File

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'));

2. Write & Append File

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);

3. Directory Operations

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

4. path Module — Cross-platform Paths

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');

5. Watch File Changes

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');
💡 Log files = production server debugging ဖို့ essential — always write logs!

← Node.js 02  |  Next: Node.js 04 → Express →

📌 Study Checklist