node fs 模块核心 api

2 阅读2分钟

一、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