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

相关推荐
天远数科17 小时前
Node.js全栈实战:构建基于天远多头借贷行业风险版API的BFF风控层
大数据·node.js
_Kayo_18 小时前
Node.js 学习笔记6
笔记·学习·node.js
winfredzhang19 小时前
[实战] Node.js + DeepSeek 打造智能档案归档系统:从混乱到有序的自动化之旅
css·node.js·js·deepseek api
亮子AI19 小时前
【Node.js】为什么数据库连接总是中断?
数据库·node.js
亮子AI19 小时前
【MySQL】node.js 如何批量更新数据?
数据库·mysql·node.js
One_Piece_Fu19 小时前
2026年node.js最新版下载(24.12.0LTS)安装教程(详细)
vscode·学习·node.js
之恒君1 天前
Node.js 模块加载 - 4 - CJS 和 ESM 互操作避坑清单
前端·node.js
Esun_R2 天前
当 LLM 开始连接真实世界:MCP 的原理、通信与工程落地
node.js·openai·mcp
爱写程序的小高2 天前
npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree
前端·npm·node.js