Skip to main content

Command Palette

Search for a command to run...

File System Operations: Read Write Delete Files

Learn: File System Operations: Read Write Delete Files

Updated
5 min readView as Markdown
T

Welcome to TopperBlog! 👋

I'm a tech content creator passionate about helping developers level up their careers and master cutting-edge technologies.

🎯 What I Write About: • AI/ML Engineering & LLMs • Web3 & Blockchain Development
• System Design & Architecture • Interview Preparation (FAANG) • Freelancing & Remote Work • Modern Tech Stacks (Next.js, React, Rust, TypeScript) • Performance Optimization & Best Practices

💼 Mission: Sharing practical, actionable insights that accelerate your tech career and maximize your earning potential.

📚 15+ In-Depth Guides covering everything from earning $10k/month as a freelancer to cracking FAANG interviews.

🌐 Let's connect and grow together in this amazing tech journey!

#TechBlogger #SoftwareEngineering #CareerGrowth #WebDevelopment #AIEngineering

File System Operations: Read Write Delete Files - Node.js fs Module

Problem

Working with files is a fundamental requirement in backend development. Developers need to:

  • Read file contents efficiently
  • Write data to files (create or overwrite)
  • Delete files when no longer needed
  • Handle errors gracefully
  • Work with both synchronous and asynchronous operations

Solution

Node.js provides the fs (File System) module with methods for all file operations. The recommended approach is using asynchronous methods with callbacks, Promises, or async/await to prevent blocking the event loop.


Code Examples

1. Reading Files

Asynchronous Read (Callback)

const fs = require('fs');

fs.readFile('./data.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error reading file:', err.message);
    return;
  }
  console.log('File contents:', data);
});

Asynchronous Read (Promise-based)

const fs = require('fs').promises;

async function readFileAsync() {
  try {
    const data = await fs.readFile('./data.txt', 'utf8');
    console.log('File contents:', data);
  } catch (err) {
    console.error('Error reading file:', err.message);
  }
}

readFileAsync();

Synchronous Read (Blocking - Use Cautiously)

const fs = require('fs');

try {
  const data = fs.readFileSync('./data.txt', 'utf8');
  console.log('File contents:', data);
} catch (err) {
  console.error('Error reading file:', err.message);
}

2. Writing Files

Asynchronous Write (Callback)

const fs = require('fs');

const content = 'Hello, World!\nThis is a test file.';

fs.writeFile('./output.txt', content, 'utf8', (err) => {
  if (err) {
    console.error('Error writing file:', err.message);
    return;
  }
  console.log('File written successfully!');
});

Asynchronous Write (Promise-based)

const fs = require('fs').promises;

async function writeFileAsync() {
  try {
    const content = 'Hello, World!\nThis is a test file.';
    await fs.writeFile('./output.txt', content, 'utf8');
    console.log('File written successfully!');
  } catch (err) {
    console.error('Error writing file:', err.message);
  }
}

writeFileAsync();

Append to File

const fs = require('fs').promises;

async function appendToFile() {
  try {
    const additionalContent = '\nAppended line.';
    await fs.appendFile('./output.txt', additionalContent, 'utf8');
    console.log('Content appended successfully!');
  } catch (err) {
    console.error('Error appending to file:', err.message);
  }
}

appendToFile();

3. Deleting Files

Asynchronous Delete (Callback)

const fs = require('fs');

fs.unlink('./output.txt', (err) => {
  if (err) {
    console.error('Error deleting file:', err.message);
    return;
  }
  console.log('File deleted successfully!');
});

Asynchronous Delete (Promise-based)

const fs = require('fs').promises;

async function deleteFileAsync() {
  try {
    await fs.unlink('./output.txt');
    console.log('File deleted successfully!');
  } catch (err) {
    console.error('Error deleting file:', err.message);
  }
}

deleteFileAsync();

4. Comprehensive Example: CRUD Operations

const fs = require('fs').promises;
const path = require('path');

class FileManager {
  constructor(filePath) {
    this.filePath = filePath;
  }

  // Create/Write file
  async create(content) {
    try {
      await fs.writeFile(this.filePath, content, 'utf8');
      console.log(`✓ File created: ${this.filePath}`);
      return true;
    } catch (err) {
      console.error(`✗ Error creating file: ${err.message}`);
      return false;
    }
  }

  // Read file
  async read() {
    try {
      const data = await fs.readFile(this.filePath, 'utf8');
      console.log(`✓ File read successfully`);
      return data;
    } catch (err) {
      console.error(`✗ Error reading file: ${err.message}`);
      return null;
    }
  }

  // Update/Append to file
  async update(content) {
    try {
      await fs.appendFile(this.filePath, `\n${content}`, 'utf8');
      console.log(`✓ File updated successfully`);
      return true;
    } catch (err) {
      console.error(`✗ Error updating file: ${err.message}`);
      return false;
    }
  }

  // Delete file
  async delete() {
    try {
      await fs.unlink(this.filePath);
      console.log(`✓ File deleted: ${this.filePath}`);
      return true;
    } catch (err) {
      console.error(`✗ Error deleting file: ${err.message}`);
      return false;
    }
  }

  // Check if file exists
  async exists() {
    try {
      await fs.access(this.filePath);
      return true;
    } catch {
      return false;
    }
  }

  // Get file stats
  async getStats() {
    try {
      const stats = await fs.stat(this.filePath);
      return {
        size: stats.size,
        created: stats.birthtime,
        modified: stats.mtime,
        isFile: stats.isFile()
      };
    } catch (err) {
      console.error(`✗ Error getting stats: ${err.message}`);
      return null;
    }
  }
}

// Usage
(async () => {
  const manager = new FileManager('./test.txt');

  // Create
  await manager.create('Initial content');

  // Read
  const content = await manager.read();
  console.log('Content:', content);

  // Update
  await manager.update('Additional line');

  // Get stats
  const stats = await manager.getStats();
  console.log('Stats:', stats);

  // Check existence
  const exists = await manager.exists();
  console.log('File exists:', exists);

  // Delete
  await manager.delete();
})();

5. Working with JSON Files

const fs = require('fs').promises;

class JSONFileManager {
  constructor(filePath) {
    this.filePath = filePath;
  }

  async readJSON() {
    try {
      const data = await fs.readFile(this.filePath, 'utf8');
      return JSON.parse(data);
    } catch (err) {
      console.error('Error reading JSON:', err.message);
      return null;
    }
  }

  async writeJSON(obj) {
    try {
      const jsonString = JSON.stringify(obj, null, 2);
      await fs.writeFile(this.filePath, jsonString, 'utf8');
      console.log('JSON file written successfully');
      return true;
    } catch (err) {
      console.error('Error writing JSON:', err.message);
      return false;
    }
  }

  async updateJSON(updates) {
    try {
      const data = await this.readJSON();
      const merged = { ...data, ...updates };
      await this.writeJSON(merged);
      console.log('JSON file updated successfully');
      return true;
    } catch (err) {
      console.error('Error updating JSON:', err.message);
      return false;
    }
  }
}

// Usage
(async () => {
  const jsonManager = new JSONFileManager('./config.json');

  // Write
  await jsonManager.writeJSON({ 
    name: 'MyApp', 
    version: '1.0.0',
    debug: true 
  });

  // Read
  const config = await jsonManager.readJSON();
  console.log('Config:', config);

  // Update
  await jsonManager.updateJSON({ debug: false, version: '1.1.0' });
})();

Key Takeaways

OperationMethodAsyncBlocking
ReadreadFile()
WritewriteFile()
AppendappendFile()
Deleteunlink()
Existsaccess()
Statsstat()

Best Practices:

  • Always use async methods to prevent blocking
  • Use fs.promises or async/await for cleaner code
  • Handle errors with try/catch blocks
  • Check file existence before operations
  • Use appropriate encoding (usually 'utf8')
  • Consider file permissions and access rights