一、fs 模块全景图(先有结构感)
fs
├── 文件操作
│ ├── readFile / writeFile / appendFile
│ ├── createReadStream / createWriteStream
│
├── 目录操作
│ ├── mkdir / readdir / rmdir
│
├── 状态 / 权限
│ ├── stat / access / chmod
│
├── 文件控制
│ ├── copyFile / rename / unlink
│
└── 监听
└── watch
👉 90% 项目只用到这些
二、最重要的 3 种用法模型(必会)
1️⃣ 一次性读写(小文件)
配置文件、JSON、模板
2️⃣ 流式读写(大文件)
视频、日志、压缩包
3️⃣ 文件系统管理
创建目录、删除、复制、监听
三、文件读写(最常用)
1️⃣ readFile —— 读取文件
const fs = require('fs');
fs.readFile('./data.txt', 'utf8', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data);
});
Promise 版(推荐)
const fs = require('fs/promises');
const data = await fs.readFile('./data.txt', 'utf8');
console.log(data);
2️⃣ writeFile —— 写文件(覆盖)
await fs.writeFile('./data.txt', 'hello world');
3️⃣ appendFile —— 追加写
await fs.appendFile('./log.txt', 'new log\n');
4️⃣ JSON 文件读写(真实场景)
const fs = require('fs/promises');
async function readJSON(path) {
const text = await fs.readFile(path, 'utf8');
return JSON.parse(text);
}
async function writeJSON(path, obj) {
await fs.writeFile(path, JSON.stringify(obj, null, 2));
}
四、流(大文件必用)
1️⃣ 读取流
const fs = require('fs');
const rs = fs.createReadStream('./big.mp4');
rs.on('data', chunk => {
console.log(chunk.length);
});
2️⃣ 写入流 + 管道(重点)
const fs = require('fs');
fs.createReadStream('./big.mp4')
.pipe(fs.createWriteStream('./copy.mp4'));
👉 不会爆内存
3️⃣ 实战:文件复制(进阶)
const fs = require('fs');
const { pipeline } = require('stream/promises');
await pipeline(
fs.createReadStream('a.txt'),
fs.createWriteStream('b.txt')
);
五、目录操作(后端必用)
1️⃣ mkdir —— 创建目录
await fs.mkdir('./logs', { recursive: true });
2️⃣ readdir —— 读目录
const files = await fs.readdir('./logs');
console.log(files);
3️⃣ rmdir / rm —— 删除目录
await fs.rm('./logs', { recursive: true, force: true });
六、文件状态 & 判断
1️⃣ stat —— 文件信息(非常重要)
const stat = await fs.stat('./data.txt');
stat.isFile(); // true
stat.isDirectory(); // false
stat.size; // 文件大小
2️⃣ 判断文件是否存在(推荐方式)
try {
await fs.access('./data.txt');
console.log('存在');
} catch {
console.log('不存在');
}
❌ 不推荐 existsSync
七、文件控制(常用)
1️⃣ 删除文件
await fs.unlink('./a.txt');
2️⃣ 重命名 / 移动
await fs.rename('./a.txt', './b.txt');
3️⃣ 拷贝文件
await fs.copyFile('./a.txt', './b.txt');
八、监听文件变化(开发利器)
fs.watch('./config.json', () => {
console.log('配置文件变了');
});
👉 热更新配置常用
九、同步 vs 异步(面试高频)
| 方法 | 是否阻塞 | 使用场景 |
|---|---|---|
| readFile | ❌ | 生产 |
| readFileSync | ✅ | 脚本 / 启动阶段 |
生产服务中,禁止 Sync
十、真实工程示例(综合)
自动创建日志文件并写入
import fs from 'fs/promises';
async function log(text) {
await fs.mkdir('./logs', { recursive: true });
await fs.appendFile('./logs/app.log', `${Date.now()} ${text}\n`);
}
log('server started');
十一、fs/promises vs fs
| 模块 | 推荐度 |
|---|---|
| fs | ⚠️ |
| fs/promises | ⭐⭐⭐⭐⭐ |
👉 Node 14+ 统一用 fs/promises
十二、一句话记忆法 ⭐⭐⭐⭐⭐
小文件 → readFile / writeFile
大文件 → stream / pipe
状态判断 → stat / access
目录管理 → mkdir / readdir / rm