node fs 模块核心 api

一、fs 模块全景图(先有结构感)

perl 复制代码
fs
├── 文件操作
│   ├── readFile / writeFile / appendFile
│   ├── createReadStream / createWriteStream
│
├── 目录操作
│   ├── mkdir / readdir / rmdir
│
├── 状态 / 权限
│   ├── stat / access / chmod
│
├── 文件控制
│   ├── copyFile / rename / unlink
│
└── 监听
    └── watch

👉 90% 项目只用到这些


二、最重要的 3 种用法模型(必会)

1️⃣ 一次性读写(小文件)

配置文件、JSON、模板

2️⃣ 流式读写(大文件)

视频、日志、压缩包

3️⃣ 文件系统管理

创建目录、删除、复制、监听


三、文件读写(最常用)

1️⃣ readFile ------ 读取文件

javascript 复制代码
const fs = require('fs');

fs.readFile('./data.txt', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log(data);
});

Promise 版(推荐)

ini 复制代码
const fs = require('fs/promises');

const data = await fs.readFile('./data.txt', 'utf8');
console.log(data);

2️⃣ writeFile ------ 写文件(覆盖)

csharp 复制代码
await fs.writeFile('./data.txt', 'hello world');

3️⃣ appendFile ------ 追加写

csharp 复制代码
await fs.appendFile('./log.txt', 'new log\n');

4️⃣ JSON 文件读写(真实场景)

javascript 复制代码
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️⃣ 读取流

ini 复制代码
const fs = require('fs');

const rs = fs.createReadStream('./big.mp4');

rs.on('data', chunk => {
  console.log(chunk.length);
});

2️⃣ 写入流 + 管道(重点)

ini 复制代码
const fs = require('fs');

fs.createReadStream('./big.mp4')
  .pipe(fs.createWriteStream('./copy.mp4'));

👉 不会爆内存


3️⃣ 实战:文件复制(进阶)

javascript 复制代码
const fs = require('fs');
const { pipeline } = require('stream/promises');

await pipeline(
  fs.createReadStream('a.txt'),
  fs.createWriteStream('b.txt')
);

五、目录操作(后端必用)

1️⃣ mkdir ------ 创建目录

csharp 复制代码
await fs.mkdir('./logs', { recursive: true });

2️⃣ readdir ------ 读目录

ini 复制代码
const files = await fs.readdir('./logs');
console.log(files);

3️⃣ rmdir / rm ------ 删除目录

php 复制代码
await fs.rm('./logs', { recursive: true, force: true });

六、文件状态 & 判断

1️⃣ stat ------ 文件信息(非常重要)

ini 复制代码
const stat = await fs.stat('./data.txt');

stat.isFile();      // true
stat.isDirectory(); // false
stat.size;          // 文件大小

2️⃣ 判断文件是否存在(推荐方式)

javascript 复制代码
try {
  await fs.access('./data.txt');
  console.log('存在');
} catch {
  console.log('不存在');
}

❌ 不推荐 existsSync


七、文件控制(常用)

1️⃣ 删除文件

csharp 复制代码
await fs.unlink('./a.txt');

2️⃣ 重命名 / 移动

csharp 复制代码
await fs.rename('./a.txt', './b.txt');

3️⃣ 拷贝文件

csharp 复制代码
await fs.copyFile('./a.txt', './b.txt');

八、监听文件变化(开发利器)

javascript 复制代码
fs.watch('./config.json', () => {
  console.log('配置文件变了');
});

👉 热更新配置常用


九、同步 vs 异步(面试高频)

方法 是否阻塞 使用场景
readFile 生产
readFileSync 脚本 / 启动阶段

生产服务中,禁止 Sync


十、真实工程示例(综合)

自动创建日志文件并写入

javascript 复制代码
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

相关推荐
凌云拓界13 小时前
状态机与思考循环 ——CogitoAgent开发实战(一)
javascript·人工智能·架构·node.js·设计规范
winfredzhang15 小时前
用 Node.js + SQLite + 原生前端写一个本地情绪急救 Web App:情绪降落伞 Mood Parachute
前端·sqlite·node.js·express·情绪管理
不好听61316 小时前
Bun vs Node.js:谁才是 TypeScript 的"亲爹"?
typescript·node.js·bun
矩阵科学16 小时前
Langchain.js 实战四:工具的使用
langchain·node.js
前端双越老师17 小时前
2026 年从 0 开发 AI Agent 需要的 10 个技能
node.js·agent·ai编程
夜雪闻竹18 小时前
版本管理:npm 发布 + Electron 打包 + CI/CD
ci/cd·npm·node.js·代码规范·chatcrystal
winfredzhang1 天前
Node.js + SQLite 实战:本地 Markdown 阅读书架源码深度解析
sqlite·node.js·safari·分页·多媒体·md文档
码云之上1 天前
聊聊如何设计一个高效、稳定的 Node.js 接入层
前端·后端·node.js
To_OC2 天前
折腾两天 HTTP 接口调用,终于把 fetch 和前后端分离从书本概念落地到实操了
javascript·node.js·全栈
zhangfeng11332 天前
workbuddy ,node.js 每次会在 项目目录上安装 node_modules,能不能一次安装多次使用,为什么 npm 不把包装在全局
前端·npm·node.js