Nodejs fs 模块常用方法与用法(详细列举)

188 阅读2分钟

一、简介

  • Node.jsfs 模块用于与文件系统交互,提供了用于文件和目录的读取、写入、更新、删除等操作的方法。它是一个核心模块,无需安装即可使用。

  • 在 Node.js 中,首先需要通过 require 引入 fs 模块:

    const fs = require('fs');
    

二、常用方法

> 读取文件

  • 异步读取

    fs.readFile('example.txt', 'utf8', (err, data) => {
      if (err) {
        console.error('Error reading file:', err);
        return;
      }
      console.log('File content:', data);
    });
    
  • 同步读取

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

> 写入文件

  • 异步写入

    fs.writeFile('example.txt', 'Hello, Node.js!', (err) => {
      if (err) {
        console.error('Error writing file:', err);
        return;
      }
      console.log('File written successfully!');
    });
    
  • 同步写入

    try {
      fs.writeFileSync('example.txt', 'Hello, Node.js!');
      console.log('File written successfully!');
    } catch (err) {
      console.error('Error writing file:', err);
    }
    

> 追加内容

  • 异步追加

    fs.appendFile('example.txt', '\nThis is appended content.', (err) => {
      if (err) {
        console.error('Error appending content:', err);
        return;
      }
      console.log('Content appended successfully!');
    });
    
  • 同步追加

    try {
      fs.appendFileSync('example.txt', '\nThis is appended content.');
      console.log('Content appended successfully!');
    } catch (err) {
      console.error('Error appending content:', err);
    }
    

> 删除文件

  • 异步删除

    fs.unlink('example.txt', (err) => {
      if (err) {
        console.error('Error deleting file:', err);
        return;
      }
      console.log('File deleted successfully!');
    });
    
  • 同步删除

    try {
      fs.unlinkSync('example.txt');
      console.log('File deleted successfully!');
    } catch (err) {
      console.error('Error deleting file:', err);
    }
    

> 检查文件或目录是否存在

注意:fs.exists 已废弃,推荐使用 fs.access

  • 异步方式

    fs.access('example.txt', fs.constants.F_OK, (err) => {
      console.log(err ? 'File does not exist' : 'File exists');
    });
    
  • 同步方式

    try {
      fs.accessSync('example.txt', fs.constants.F_OK);
      console.log('File exists');
    } catch (err) {
      console.log('File does not exist');
    }
    

> 读取目录内容

  • 异步读取

    fs.readdir('./', (err, files) => {
      if (err) {
        console.error('Error reading directory:', err);
        return;
      }
      console.log('Directory contents:', files);
    });
    
  • 同步读取

    try {
      const files = fs.readdirSync('./');
      console.log('Directory contents:', files);
    } catch (err) {
      console.error('Error reading directory:', err);
    }
    

> 创建目录

  • 异步创建

    fs.mkdir('new-folder', (err) => {
      if (err) {
        console.error('Error creating directory:', err);
        return;
      }
      console.log('Directory created successfully!');
    });
    
  • 同步创建

    try {
      fs.mkdirSync('new-folder');
      console.log('Directory created successfully!');
    } catch (err) {
      console.error('Error creating directory:', err);
    }
    

> 删除目录

  • 异步删除

    fs.rmdir('new-folder', (err) => {
      if (err) {
        console.error('Error deleting directory:', err);
        return;
      }
      console.log('Directory deleted successfully!');
    });
    
  • 同步删除

    try {
      fs.rmdirSync('new-folder');
      console.log('Directory deleted successfully!');
    } catch (err) {
      console.error('Error deleting directory:', err);
    }
    

> 重命名文件或目录

  • 异步重命名

    fs.rename('old-name.txt', 'new-name.txt', (err) => {
      if (err) {
        console.error('Error renaming file:', err);
        return;
      }
      console.log('File renamed successfully!');
    });
    
  • 同步重命名

    try {
      fs.renameSync('old-name.txt', 'new-name.txt');
      console.log('File renamed successfully!');
    } catch (err) {
      console.error('Error renaming file:', err);
    }
    

> 获取文件状态

  • 异步方式

    fs.stat('example.txt', (err, stats) => {
      if (err) {
        console.error('Error getting file stats:', err);
        return;
      }
      console.log('File stats:', stats);
    });
    
  • 同步方式

    try {
      const stats = fs.statSync('example.txt');
      console.log('File stats:', stats);
    } catch (err) {
      console.error('Error getting file stats:', err);
    }
    

> 监视文件

  • 使用 fs.watch 可以监视文件或目录的更改。

    fs.watch('example.txt', (eventType, filename) => {
      console.log(`File ${filename} changed with event: ${eventType}`);
    });
    

三、常见错误处理

  • 检查路径是否存在:使用 fs.accessfs.stat

  • 异步操作防止阻塞:尽量使用异步方法而不是同步方法。

  • 权限问题:确保程序有权限操作指定文件或目录。

四、总结

  • 异步优先:使用异步方法(带回调)能提高性能,避免阻塞事件循环。

  • 模块化:复杂操作可以拆分成模块或函数,减少代码重复。

  • 结合 path 模块:配合 path 模块处理动态路径,避免跨平台路径问题。