在 Linux 环境里做 Node.js 开发,文件系统操作几乎绕不开。无论是读取配置、写日志,还是处理上传文件,核心都落在内置的 fs 模块上。下面按“先理解两种调用方式,再看常用 API,最后结合示例判断场景”的顺序梳理,方便你在实际项目里更快选对方法。
先认识核心:Node.js 的 fs 模块
Node.js 在 Linux 上操作文件和目录,主要依赖内置的 fs 模块。这个模块覆盖了日常开发里最常见的文件系统需求,包括读取、写入、追加、删除、重命名、创建目录和遍历目录。
如果只是入门,可以先抓住一个判断原则:同样的文件操作,fs 往往同时提供异步和同步两种写法,区别不在“能不能完成任务”,而在“执行时会不会阻塞程序”。
为什么多数场景更推荐异步方法
异步方法是更常见、也更适合服务端程序的选择。它们通过回调函数返回结果,不会让 JavaScript 主线程停下来等待磁盘 I/O 完成,因此在高并发场景下更有优势。
对于 Web 服务、接口程序、日志处理等任务,这种不阻塞事件循环的特性尤其重要。代价是代码逻辑需要围绕回调结果来组织,处理错误时也要更仔细。
常用异步文件与目录操作
fs.readFile(path[, options], callback):异步读取文件内容,回调函数返回文件数据。fs.writeFile(file[, data[, options]], callback):异步写入数据到文件,如果文件不存在则创建,存在则覆盖。fs.appendFile(file[, data[, options]], callback):异步向文件追加数据,适合记录日志等场景。fs.unlink(path, callback):异步删除文件,注意这个操作不可逆。fs.rename(oldPath, newPath, callback):异步重命名文件或目录,也可以用来移动文件。fs.mkdir(path[, options], callback):异步创建目录,支持递归创建。fs.readdir(path[, options], callback):异步读取目录内容,返回目录下的文件列表。
什么时候同步方法更省事
同步方法的特点很直接:调用后会一直阻塞事件循环,直到操作完成。文件很大、磁盘 I/O 很慢,或者当前机器负载较高时,这种阻塞会让程序明显卡住。
但同步方法并不是“不能用”。在初始化脚本、配置文件加载、一次性本地工具脚本这类场景里,同步写法往往更短、更直观,代码阅读成本也更低。
常用同步文件与目录操作
fs.readFileSync(path[, options]):同步读取文件内容。fs.writeFileSync(file[, data[, options]]):同步写入数据到文件。fs.appendFileSync(file[, data[, options]]):同步向文件追加数据。fs.unlinkSync(path):同步删除文件。fs.renameSync(oldPath, newPath):同步重命名文件或目录。fs.mkdirSync(path[, options]):同步创建目录。fs.readdirSync(path[, options]):同步读取目录内容。
一个完整示例:写入、读取再删除文件
只看方法名不够直观,放到一段完整流程里更容易理解。下面这段代码演示了如何使用异步方法完成写入、读取和删除文件:


const fs = require('fs');
// 写入文件
fs.writeFile('example.txt', 'Hello, World!', (err) => {
if (err) throw err;
console.log('文件已保存');
});
// 读取文件
fs.readFile('example.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
// 删除文件
fs.unlink('example.txt', (err) => {
if (err) throw err;
console.log('文件已删除');
});
这段示例展示了三个最基础的动作:先用 fs.writeFile 创建并写入 example.txt,再通过 fs.readFile 读取内容,最后使用 fs.unlink 删除文件。
需要注意的是,异步调用的执行顺序和书写顺序不是一回事。上面这段代码适合演示 API 形式,但在真实项目里,如果后一步依赖前一步结果,通常需要把流程串起来处理,否则就可能出现“文件还没写完就开始读取”的问题。
实际开发里怎么选异步还是同步
把选择标准说简单一点,可以从运行场景判断:
- 如果程序要长期运行,并且需要同时处理多个请求,比如 Web 服务、接口服务,优先用异步方法。
- 如果程序是启动时执行一次的初始化逻辑,或者只是本地脚本、配置加载脚本,同步方法通常更省事。
核心差异始终只有一个:异步方法不会阻塞事件循环,但需要处理回调;同步方法逻辑更直接,但会阻塞程序执行。实际项目里没有绝对优劣,关键是看当前任务更在意吞吐能力,还是更在意代码路径清晰。









