在 JavaScript (Node.js) 中处理文件系统
在现代 Web 开发中,JavaScript 早已超越了浏览器的范畴。借助 Node.js 平台,开发者能够创建服务器端应用程序、操作数据库,当然,还能与文件系统进行交互。读写、删除和移动文件的能力是任何后端开发者的关键技能之一。本文将详细讲解如何在 Node.js 中使用 JavaScript 处理文件系统,我们将使用内置模块 fs 及其现代的基于 Promise 的版本 fs/promises。
本文内容既适合刚开始学习 Node.js 的新手,也适合希望系统化知识的有经验的开发者。所有代码示例都可以在你的开发环境中运行。
引入 fs 模块及主要方法
在 Node.js 中,处理文件系统需要使用内置模块 fs (file system)。它无需单独安装——安装 Node.js 后即可使用。引入方式为标准方法:
const fs = require('fs');然而,在现代 JavaScript (ES6+) 和 Node.js (从版本 14 开始) 中,推荐使用 ES modules 语法,并使用基于 Promise 的 fs/promises 版本。这可以避免“回调地狱”,并通过 async/await 编写更简洁的异步代码。
import * as fs from 'fs/promises';// 或者const fs = require('fs/promises');fs 模块的主要方法分为三类:
- 同步方法 — 会阻塞执行流 (例如
fs.readFileSync())。使用较少,主要用于初始化脚本。 - 带回调的异步方法 — 传统的 Node.js 风格 (例如
fs.readFile())。 - 基于 Promise 的异步方法 — 现代风格 (
fs/promises)。推荐用于大多数任务。
在 Node.js 中读取文件
我们从最常见的操作开始——读取文件内容。我们将介绍两种方法:使用回调和使用 Promise。
通过回调读取 (传统方式)
const fs = require('fs');
fs.readFile('example.txt', 'utf8', (err, data) => { if (err) { console.error('读取文件时出错:', err); return; } console.log('文件内容:', data);});请注意:我们将编码 'utf8' 作为第二个参数传递。如果不指定,数据将以二进制缓冲区 (Buffer) 的形式返回。
通过 Promise 读取 (推荐方式)
import { readFile } from 'fs/promises';
async function readExample() { try { const data = await readFile('example.txt', 'utf8'); console.log('文件内容:', data); } catch (err) { console.error('读取文件时出错:', err); }}
readExample();代码变得更清晰、更易理解。错误通过 try/catch 处理,这对于熟悉其他语言的开发者来说很习惯。
将数据写入文件
写入文件是第二重要的操作。在 Node.js 中有两个主要方法:writeFile (覆盖文件) 和 appendFile (将数据追加到文件末尾)。
覆盖文件
import { writeFile } from 'fs/promises';
async function writeExample() { try { await writeFile('output.txt', '你好,世界!', 'utf8'); console.log('文件写入成功'); } catch (err) { console.error('写入时出错:', err); }}
writeExample();如果 output.txt 文件不存在,它会被自动创建。如果存在,其内容将被完全覆盖。