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(递归删除多
相关推荐
吴声子夜歌11 小时前
Node.js——操作MySQL数据库
数据库·mysql·node.js
清风细雨_林木木14 小时前
Node.js 和 Python 的关系
node.js
吴声子夜歌14 小时前
Node.js——Express框架
node.js·express
吴声子夜歌16 小时前
Node.js——异常处理
node.js
FreeBuf_18 小时前
谷歌将Axios npm供应链攻击归因于朝鲜APT组织UNC1069
前端·npm·node.js
阿正的梦工坊18 小时前
pnpm和npm前端包管理工具有什么不同?
前端·npm·node.js
叶半欲缺18 小时前
Node.js 安装教程
node.js
吴声子夜歌18 小时前
Node.js——Web模板引擎
前端·node.js
雪碧聊技术19 小时前
linux下载node.js(这里面已经包含了npm)
npm·node.js
摇滚侠1 天前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js