fs 文件系统:Node.js 操作磁盘的 “万能工具”

fs 是 Node.js 的内置模块(不用额外装),全称file system ,能实现文件 / 文件夹的写入、读取、移动、删除等操作。这部分是 Node.js 的核心,比如做日志、下载文件都要用到。

用 fs 前必须先导入模块,一行代码搞定:

javascript 复制代码
const fs = require('fs'); // 导入fs模块,Node.js自带

1. 文件写入:把数据存到本地文件

比如保存日志、写配置文件,都需要文件写入。fs 提供 4 种写入方式,对应不同场景:

方法 类型 适用场景
writeFile 异步 写入频率低、小文件
writeFileSync 同步 简单场景,不介意阻塞代码
appendFile / appendFileSync 追加 往文件末尾加内容(如日志)
createWriteStream 流式 大文件(如视频)、频繁写入
1.1 异步写入:writeFile(推荐,不阻塞代码)

异步操作需要用回调函数处理结果(成功 / 失败),代码示例:

javascript 复制代码
// 把"三人行,必有我师焉。"写入到当前目录的"座右铭.txt"
fs.writeFile('./座右铭.txt', '三人行,必有我师焉。', err => {
  // err是错误对象:写入失败则err有值,成功则err为null
  if (err) {
    console.log('写入失败:', err);
    return; // 失败就退出,不执行后面的代码
  }
  console.log('写入成功!');
});
1.2 同步写入:writeFileSync(简单,但阻塞代码)

同步操作会让代码 "卡住",直到写入完成才继续执行,适合简单场景:

javascript 复制代码
// 同步写入要加try-catch捕获错误(异步用回调,同步用try-catch)
try {
  fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
  console.log('同步写入成功!');
} catch (e) {
  console.log('同步写入失败:', e);
}
1.3 追加写入:appendFile(往文件末尾加内容)

比如写日志时,不能覆盖旧内容,就用追加:

javascript 复制代码
// 异步追加:往"座右铭.txt"末尾加"择其善者而从之"
fs.appendFile('./座右铭.txt', '择其善者而从之,其不善者而改之。', err => {
  if (err) throw err; // 抛出错误
  console.log('追加成功!');
});

// 同步追加:加个换行符\r\n,让内容换行
fs.appendFileSync('./座右铭.txt', '\r\n温故而知新,可以为师矣');
1.4 流式写入:createWriteStream(大文件必备)

如果要写几百 MB 的视频 / 压缩包,用上面的方法会卡死,流式写入会 "分批次" 写,减少内存占用:

javascript 复制代码
// 创建流式写入对象,目标文件是"观书有感.txt"
let ws = fs.createWriteStream('./观书有感.txt');

// 分4次写入内容(每次写一行)
ws.write('半亩方塘一鉴开\r\n'); // \r\n是换行符(Windows用,Linux用\n)
ws.write('天光云影共徘徊\r\n');
ws.write('问渠那得清如许\r\n');
ws.write('为有源头活水来\r\n');

// 写完后调用end(),告诉程序"我写完了"
ws.end();

注意:

  • 普通文件操作(如 fs.writeFile )是"一次性"的过程式操作:调用方法后,只需等待操作完成(异步通过回调、同步通过阻塞),无需后续的精细控制。因此它们不需要返回可操作的对象,只需返回 undefined 即可。
  • 而流式写入面向大文件或频繁写入场景,需要分批次、可中断、可监控的写入能力,是"持续的管道操作",需要返回一个能管理整个管道生命周期的对象

2. 文件读取:从本地文件拿数据

比如打开配置文件、读取日志,都需要文件读取。同样有 3 种方式:

2.1 异步读取:readFile(小文件常用)
javascript 复制代码
// 方式1:不指定编码,读出来是Buffer(需要自己转字符串)
fs.readFile('./座右铭.txt', (err, data) => {
  if (err) throw err;
  console.log('Buffer格式:', data); // 输出<Buffer e4 b8 89 ...>
  console.log('转字符串:', data.toString()); // 转成中文
});

// 方式2:指定编码为utf-8,直接读出来是字符串
fs.readFile('./座右铭.txt', 'utf-8', (err, data) => {
  if (err) throw err;
  console.log('直接读字符串:', data); // 直接输出中文内容
});
2.2 同步读取:readFileSync(简单场景用)
javascript 复制代码
// 不指定编码:返回Buffer
let data1 = fs.readFileSync('./座右铭.txt');
// 指定编码:返回字符串
let data2 = fs.readFileSync('./座右铭.txt', 'utf-8');

console.log('同步读Buffer:', data1);
console.log('同步读字符串:', data2);
2.3 流式读取:createReadStream(大文件必备)

读大文件(如视频)时,流式读取会分批次读(每次读 64KB),避免内存爆掉:

javascript 复制代码
// 创建流式读取对象,读取"观书有感.txt"
let rs = fs.createReadStream('./观书有感.txt');

// 【data事件】:每读一批数据(64KB),就触发一次
rs.on('data', data => {
  console.log('当前读取到的数据:', data.toString());
  console.log('这批数据大小:', data.length); // 输出64或更小(最后一批可能不足64KB)
});

// 【end事件】:所有数据读完后,触发一次
rs.on('end', () => {
  console.log('全部读取完成!');
});

3. 文件移动 / 重命名:rename(一个方法搞定两件事)

不管是移动文件到其他文件夹,还是给文件改名字,都用renamerenameSync

javascript 复制代码
// 1. 移动文件:把"观书有感.txt"移到"论语"文件夹下(先手动创建"论语"文件夹)
fs.rename('./观书有感.txt', './论语/观书有感.txt', (err) => {
  if (err) throw err;
  console.log('文件移动成功!');
});

// 2. 重命名文件:把"座右铭.txt"改成"我的座右铭.txt",同时移到"论语"文件夹
fs.renameSync('./座右铭.txt', './论语/我的座右铭.txt');
console.log('文件重命名+移动成功!');

4. 文件删除:unlink(简单直接)

删除文件用unlinkunlinkSync(注意:删除后无法恢复,谨慎操作!):

javascript 复制代码
// 异步删除"test.txt"
fs.unlink('./test.txt', err => {
  if (err) throw err;
  console.log('文件删除成功!');
});

// 同步删除"test2.txt"
fs.unlinkSync('./test2.txt');
console.log('同步删除成功!');

5. 文件夹操作:创建、读取、删除

除了文件,fs 也能操作文件夹,比如创建多层文件夹、读取文件夹内容:

方法 功能 关键选项
mkdir / mkdirSync 创建文件夹 recursive: true(递归创建多层)
readdir / readdirSync 读取文件夹内容 返回文件夹下的文件 / 子文件夹列表
rmdir / rmdirSync 删除文件夹 recursive: true(递归删除多
相关推荐
tryCbest7 小时前
Node.js使用Express框架解决中文乱码问题
node.js·express
时间的情敌7 小时前
对Webpack的深度解析
前端·webpack·node.js
濮水大叔8 小时前
AOP编程有三大场景:控制器切面,内部切面,外部切面,你get到了吗?
typescript·node.js·nestjs
Icoolkj8 小时前
npm、npx、pnpm 深度解析:从原理到实战的全方位指南
前端·npm·node.js
尘埃不入你眼眸8 小时前
powerShell无法执行npm问题
前端·npm·node.js
我是一只懒羊羊8 小时前
从零搭建 Node.js企业级 Web 服务器:自定义服务&数据请求
前端·node.js·全栈
我有一棵树8 小时前
npm uninstall 执行的操作、有时不会删除 node_modules 下对应的文件夹
前端·npm·node.js
幸运黒锦鲤10 小时前
npm 扩展Vite、Element-plus 、Windcss、Vue Router
前端·npm·node.js
你的人类朋友18 小时前
【Node】认识一下Node.js 中的 VM 模块
前端·后端·node.js