NodeJs-File system(一)

 后端   小卒子   2024-09-02 22:08   153
  nodejs

Node.js 的文件系统(File System, fs)模块允许你与文件和目录进行交互。fs 模块提供了很多方法来操作文件和目录,包括读取、写入、删除、重命名文件和目录等。fs 模块中的方法有同步和异步版本。异步方法更常用,因为它们不会阻塞事件循环。

1. 引入 fs 模块

在使用 fs 模块之前,需要先引入它:

const fs = require('fs');

2. 常用方法

以下是 Node.js fs 模块中的一些常用方法及其详细说明:

2.1 文件操作

  1. fs.readFile(path[, options], callback)

    异步读取文件的内容。

    • path: 字符串或 Buffer,文件的路径。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'r' 读取模式)。
    • callback: 回调函数,格式为 (err, data)data 是读取的文件内容。

    示例:

    fs.readFile('example.txt', 'utf8', (err, data) => {
      if (err) throw err;
      console.log(data);
    });
    
  2. fs.readFileSync(path[, options])

    同步读取文件的内容。

    • path: 字符串或 Buffer,文件的路径。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'r' 读取模式)。

    示例:

    try {
      const data = fs.readFileSync('example.txt', 'utf8');
      console.log(data);
    } catch (err) {
      console.error(err);
    }
    
  3. fs.writeFile(file, data[, options], callback)

    异步写入文件。如果文件已存在,则覆盖该文件。

    • file: 字符串或 Buffer,文件的路径。
    • data: 字符串或 Buffer,要写入的数据。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'w' 写入模式)。
    • callback: 回调函数,格式为 (err)

    示例:

    fs.writeFile('example.txt', 'Hello, world!', (err) => {
      if (err) throw err;
      console.log('File has been saved!');
    });
    
  4. fs.writeFileSync(file, data[, options])

    同步写入文件。如果文件已存在,则覆盖该文件。

    • file: 字符串或 Buffer,文件的路径。
    • data: 字符串或 Buffer,要写入的数据。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'w' 写入模式)。

    示例:

    try {
      fs.writeFileSync('example.txt', 'Hello, world!');
      console.log('File has been saved!');
    } catch (err) {
      console.error(err);
    }
    
  5. fs.appendFile(file, data[, options], callback)

    异步追加数据到文件。如果文件不存在,则创建文件。

    • file: 字符串或 Buffer,文件的路径。
    • data: 字符串或 Buffer,要追加的数据。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'a' 追加模式)。
    • callback: 回调函数,格式为 (err)

    示例:

    fs.appendFile('example.txt', 'Hello again!', (err) => {
      if (err) throw err;
      console.log('Data has been appended!');
    });
    
  6. fs.appendFileSync(file, data[, options])

    同步追加数据到文件。如果文件不存在,则创建文件。

    • file: 字符串或 Buffer,文件的路径。
    • data: 字符串或 Buffer,要追加的数据。
    • options: 对象(可选),可以指定编码(如 'utf8')和标志(如 'a' 追加模式)。

    示例:

    try {
      fs.appendFileSync('example.txt', 'Hello again!');
      console.log('Data has been appended!');
    } catch (err) {
      console.error(err);
    }
    
  7. fs.rename(oldPath, newPath, callback)

    异步重命名文件或目录。

    • oldPath: 字符串或 Buffer,当前文件或目录的路径。
    • newPath: 字符串或 Buffer,新文件或目录的路径。
    • callback: 回调函数,格式为 (err)

    示例:

    fs.rename('oldName.txt', 'newName.txt', (err) => {
      if (err) throw err;
      console.log('File has been renamed!');
    });
    
  8. fs.renameSync(oldPath, newPath)

    同步重命名文件或目录。

    • oldPath: 字符串或 Buffer,当前文件或目录的路径。
    • newPath: 字符串或 Buffer,新文件或目录的路径。

    示例:

    try {
      fs.renameSync('oldName.txt', 'newName.txt');
      console.log('File has been renamed!');
    } catch (err) {
      console.error(err);
    }
    
  9. fs.unlink(path, callback)

    异步删除文件。

    • path: 字符串或 Buffer,文件的路径。
    • callback: 回调函数,格式为 (err)

    示例:

    fs.unlink('example.txt', (err) => {
      if (err) throw err;
      console.log('File has been deleted!');
    });
    
  10. fs.unlinkSync(path)

    同步删除文件。

    • path: 字符串或 Buffer,文件的路径。

    示例:

    try {
      fs.unlinkSync('example.txt');
      console.log('File has been deleted!');
    } catch (err) {
      console.error(err);
    }
    
  11. fs.stat(path, callback)

    异步获取文件的状态信息。

    • path: 字符串或 Buffer,文件的路径。
    • callback: 回调函数,格式为 (err, stats)

    stats 是一个 fs.Stats 对象,提供文件的信息(如大小、创建时间等)。

    示例:

    fs.stat('example.txt', (err, stats) => {
      if (err) throw err;
      console.log(stats);
    });
    
  12. fs.statSync(path)

    同步获取文件的状态信息。

    • path: 字符串或 Buffer,文件的路径。

    示例:

    try {
      const stats = fs.statSync('example.txt');
      console.log(stats);
    } catch (err) {
      console.error(err);
    }
    

2.2 目录操作

  1. fs.mkdir(path[, options], callback)

    异步创建目录。

    • path: 字符串或 Buffer,新目录的路径。
    • options: 对象(可选),可以指定 recursive(递归创建)和 mode(权限)等选项。
    • callback: 回调函数,格式为 (err)

    示例:

    fs.mkdir('newDir', { recursive: true }, (err) => {
      if (err) throw err;
      console.log('Directory created!');
    });
    
  2. fs.mkdirSync(path[, options])

    同步创建目录。

    • path: 字符串或 Buffer,新目录的路径。
    • options: 对象(可选),可以指定 recursive(递归创建)和 mode(权限)等选项。

    示例:

    try {
      fs.mkdirSync('newDir', { recursive: true });
      console.log('Directory created!');
    } catch (err) {
      console.error(err);
    }
    
  3. fs.rmdir(path[, options], callback)

    异步删除目录。要删除的目录必须为空。

    • path: 字符串或 Buffer,目录的路径。
    • options: 对象(可选),可以指定 recursive(递归删除)等选项(从 Node.js

12.10.0 开始)。

  • callback: 回调函数,格式为 (err)

示例:

fs.rmdir('newDir', (err) => {
  if (err) throw err;
  console.log('Directory removed!');
});
  1. fs.rmdirSync(path[, options])

    同步删除目录。要删除的目录必须为空。

    • path: 字符串或 Buffer,目录的路径。
    • options: 对象(可选),可以指定 recursive(递归删除)等选项(从 Node.js 12.10.0 开始)。

    示例:

    try {
      fs.rmdirSync('newDir');
      console.log('Directory removed!');
    } catch (err) {
      console.error(err);
    }
    
  2. fs.readdir(path[, options], callback)

    异步读取目录的内容。

    • path: 字符串或 Buffer,目录的路径。
    • options: 对象(可选),可以指定 encoding(编码)等选项。
    • callback: 回调函数,格式为 (err, files)files 是目录中内容的数组。

    示例:

    fs.readdir('.', (err, files) => {
      if (err) throw err;
      console.log(files);
    });
    
  3. fs.readdirSync(path[, options])

    同步读取目录的内容。

    • path: 字符串或 Buffer,目录的路径。
    • options: 对象(可选),可以指定 encoding(编码)等选项。

    示例:

    try {
      const files = fs.readdirSync('.');
      console.log(files);
    } catch (err) {
      console.error(err);
    }
    

2.3 其他操作

  1. fs.copyFile(src, dest[, mode], callback)

    异步复制文件。

    • src: 字符串或 Buffer,源文件的路径。
    • dest: 字符串或 Buffer,目标文件的路径。
    • mode: 整数(可选),指定文件复制的行为,可以是 fs.constants.COPYFILE_EXCLfs.constants.COPYFILE_FICLONE
    • callback: 回调函数,格式为 (err)

    示例:

    fs.copyFile('source.txt', 'destination.txt', (err) => {
      if (err) throw err;
      console.log('File copied!');
    });
    
  2. fs.copyFileSync(src, dest[, mode])

    同步复制文件。

    • src: 字符串或 Buffer,源文件的路径。
    • dest: 字符串或 Buffer,目标文件的路径。
    • mode: 整数(可选),指定文件复制的行为,可以是 fs.constants.COPYFILE_EXCLfs.constants.COPYFILE_FICLONE

    示例:

    try {
      fs.copyFileSync('source.txt', 'destination.txt');
      console.log('File copied!');
    } catch (err) {
      console.error(err);
    }
    
  3. fs.watch(filename[, options], listener)

    监视文件或目录的变化。

    • filename: 字符串或 Buffer,要监视的文件或目录的路径。
    • options: 对象(可选),可以指定 persistent(是否持续监视)、recursive(是否递归监视子目录)等选项。
    • listener: 回调函数,格式为 (eventType, filename),当文件或目录变化时被调用。

    示例:

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

3. 小结

Node.js 的 fs 模块提供了丰富的文件系统操作方法,包括文件读写、目录操作和文件监视等。了解这些方法的同步和异步版本以及各自的使用场景,可以帮助你在 Node.js 应用程序中高效地进行文件和目录操作。无论是简单的文件读写,还是复杂的文件系统监视,fs 模块都是一个强大的工具。