likes
comments
collection
share

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

作者站长头像
站长
· 阅读数 3

一、 前言

最近在看Node.js的文档,密密麻麻给我搞吐了,总结一下Node.js内置模块里比较常用的函数和方法。

今天是Node.js这个系列的第一篇,鉴于Node.js的文件系统(fs)模块是构建服务器端和本地文件处理功能的关键组成部分,我们先上重点。

二、 同步和异步函数

在了解模块之前,我们得先要了解同步和异步函数。

在Node.js文件系统(fs)模块中,同步和异步函数的主要区别在于它们执行文件操作的方式和对程序流的影响。

在下面这个对比中,我们以fs模块中的fs.readFileSync()fs.readFile()为例作对比。

同步函数

  1. 阻塞执行: 同步函数会阻塞程序的执行,意味着在执行同步文件操作期间,程序将停止执行其他任务。这种方式可能会导致程序在等待文件操作完成时处于空闲状态。

  2. 返回值: 同步函数通常直接返回执行结果或抛出错误。由于是阻塞的,只有在操作完成后才能继续执行后续代码。

异步函数

  1. 非阻塞执行: 异步函数不会阻塞程序的执行,而是在执行文件操作的同时继续执行后续代码。这样可以提高程序的并发性和响应性,特别是在处理大量并发请求时。

  2. 回调函数: 异步函数通常使用回调函数来处理文件操作的结果。回调函数在文件操作完成后被调用,传递给回调函数的参数包括错误信息和操作结果。

  3. 事件驱动: 异步函数的执行是事件驱动的,它利用事件循环机制。这种方式使得程序可以在等待文件操作完成的同时执行其他任务。

fs.readFileSync() - 同步函数

当我们使用 fs.readFileSync() 也即 同步函数 时,就好像读一本故事书。这个过程是同步的,就像你坐下来专心读一本书,而在你读完这本书之前,其他事情都暂时得等等。

举个例子:

# 引入文件系统模块
const fs = require('fs');

try {
  const story = fs.readFileSync('story.txt', 'utf-8');
  console.log(story);
} catch (error) {
  console.error('读取故事时发生错误:', error.message);
}

fs.readFile() - 异步函数

而当我们使用 fs.readFile() 也即 异步函数 时时,就像是在交替进行读书和做其他事情。这个方法是异步的,允许我们在等待文件读取的同时,做一些其他的事情。

举个例子:

# 引入文件系统模块
const fs = require('fs');

fs.readFile('story.txt', 'utf-8', (error, story) => {
  if (error) {
    console.error('哎呀,读取故事时发生错误:', error.message);
  } else {
    console.log(story);
  }
});

这就像是你开始读故事,但不必一直等到故事读完。你可以在等待的时候去做其他事情,当故事准备好了,它会告诉你,你再回来继续阅读。

不同点:

  • fs.readFileSync() 是同步的,会阻塞程序执行,直到文件读取完成。
  • fs.readFile() 是异步的,不会阻塞程序执行,可以在文件读取的同时继续执行其他任务。

选择使用场景:

  • 如果你只需要在读取文件时专心一心,就像读故事书一样,可以选择 fs.readFileSync()
  • 如果你想在等待文件读取的同时做其他事情,就像读书的同时做其他活动,可以选择 fs.readFile()

三、 Node.js里 fs 模块中十个较为常用的函数方法

在Node.js文件系统模块(fs)中,有很多函数和方法可供我们使用。以下是我总结的十个较为常用而重要的函数方法:

1. readFileSync(path, [options])

描述: 同步地读取文件的内容。它会阻塞程序的执行,直到文件读取完成。

参数:

  • path:文件的路径。
  • [options]:可选对象,指定文件读取选项。

示例:

 # 引入文件系统
 const fs = require('fs');

 try {
     const data = fs.readFileSync('data.txt', 'utf-8');
     console.log(data);
 } catch (error) {
     console.error('读取文件时发生错误:', error.message);
 }

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

在终端运行,可以看到这里读取了我们 data.txt 中的内容。

2. writeFileSync(file, data, [options])

描述: 同步将数据写入文件,如果文件存在则替换。

参数:

  • file:文件的路径。
  • data:要写入文件的数据。
  • [options]:可选对象,指定文件写入选项。

示例:

  # 引入文件系统
 const fs = require('fs');
 
 fs.writeFileSync('data.txt', 'Hello, Node.js!');

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

writeFileSync() 把 data.txt 中的内容替换成了'Hello, Node.js!'。

3. existsSync(path)

描述: 同步检查文件或目录是否存在。

参数:

  • path:文件或目录的路径。

示例:

 const fs = require('fs')

 // fs.writeFileSync('data.txt', 'Hello, Node.js!');
 const fileExists = fs.existsSync('data.txt');
 console.log(fileExists)

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

4. readFile(path, [options], callback)

描述: 异步读取文件的内容,通过回调函数处理读取结果。

参数:

  • path:文件的路径。
  • [options]:可选对象,指定文件读取选项。
  • callback:处理读取数据或错误的回调函数。

示例:

const fs = require('fs')

 // fs.writeFileSync('data.txt', 'Hello, Node.js!');
 // const fileExists = fs.existsSync('data.txt');
 // console.log(fileExists)
 fs.readFile('data.txt', 'utf-8', (err, data) => {
     if (err) throw err;
     console.log(data);
 });

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

此时,我们成功读取到了 data.txt 的内容

5. writeFile(file, data, [options], callback)

描述: 异步地将数据写入文件。使用回调函数处理写入结果。

参数:

  • file:文件的路径。
  • data:要写入文件的数据。
  • [options]:可选对象,指定文件写入选项。
  • callback:处理写入操作错误的回调函数。

示例:

 fs.writeFile('data.txt', 'Hello, Node.js!', (err) => {
   if (err) throw err;
   console.log('文件写入成功!');
 });

此时,data.txt 中的内容变成 Hello, Node.js!

6. unlink(path, callback)

描述: 异步删除文件。

参数:

  • path:文件的路径。
  • callback:处理删除操作错误的回调函数。

示例:

 fs.unlink('example.txt', (err) => {
   if (err) throw err;
   console.log('文件删除成功!');
 });

此时,data.txt 就被删掉了

7. readdir(path, callback)

描述: 用于异步地读取目录内容,返回目录中所有文件和子目录的名称数组。这个方法的主要作用是列出指定目录中的所有项目。

参数:

  • path:目录的路径。
  • callback:处理目录列表或错误的回调函数。

示例:

 fs.readdir('.', (err, files) => {
   if (err) throw err;
   console.log('目录中的文件列表:', files);
 });

Node.js 内置模块大揭秘:文件系统(fs)模块(含fs模块常见函数总结)

8. stat(path, callback)

描述: 用于异步地获取文件或目录的状态信息,包括文件大小、创建时间、修改时间等。这个方法不仅适用于文件,也适用于目录。

参数:

  • path:文件或目录的路径。
  • callback:处理文件/目录信息或错误的回调函数。

示例:

 fs.stat('data.txt', (err, stats) => {
   if (err) throw err;
   console.log('文件信息:', stats);
 });

9. mkdir(path, [options], callback)

描述: 异步地创建目录。默认情况下,新目录会在当前 Node.js 进程的工作目录(current working directory)中创建。

参数:

  • path:新目录的路径。
  • [options]:可选对象,指定目录创建选项。
  • callback:处理目录创建错误的回调函数。

示例:

 fs.mkdir('newDirectory', (err) => {
   if (err) throw err;
   console.log('目录创建成功!');
 });

在此文件的上级文件夹之下创建了 newDirectory这个新目录

10. rename(oldPath, newPath, callback)

描述: 异步地重命名文件或目录。

参数:

  • oldPath:文件或目录的当前路径。
  • newPath:文件或目录的新路径或名称。
  • callback:处理重命名操作错误的回调函数。

示例:

 fs.rename('data.txt', 'newFile.txt', (err) => {
   if (err) throw err;
   console.log('文件重命名成功!');
 });

此时,data.txt 变成了 newFile.txt

6. 总结

通过深入了解这些函数,我们可以更加高效地处理文件和目录,使我们的 Node.js 应用在文件系统操作方面更加强大可靠。希望这篇文章对你理解 Node.js 文件系统模块提供的功能有所帮助。