当前位置: 首页 > news >正文

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

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

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

const fs = require('fs'); // 导入fs模块,Node.js自带

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

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

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

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

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

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

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

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

// 异步追加:往“座右铭.txt”末尾加“择其善者而从之”
fs.appendFile('./座右铭.txt', '择其善者而从之,其不善者而改之。', err => {if (err) throw err; // 抛出错误console.log('追加成功!');
});// 同步追加:加个换行符\r\n,让内容换行
fs.appendFileSync('./座右铭.txt', '\r\n温故而知新,可以为师矣');
1.4 流式写入:createWriteStream(大文件必备)

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

// 创建流式写入对象,目标文件是“观书有感.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(小文件常用)
// 方式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(简单场景用)
// 不指定编码:返回Buffer
let data1 = fs.readFileSync('./座右铭.txt');
// 指定编码:返回字符串
let data2 = fs.readFileSync('./座右铭.txt', 'utf-8');console.log('同步读Buffer:', data1);
console.log('同步读字符串:', data2);
2.3 流式读取:createReadStream(大文件必备)

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

// 创建流式读取对象,读取“观书有感.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

// 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(注意:删除后无法恢复,谨慎操作!):

// 异步删除“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(递归删除多
http://www.dtcms.com/a/461216.html

相关文章:

  • Android + iOS 手机抓包 App 实操教程
  • 智慧新零售时代:施易德系统平衡技术与人力,赋能门店运营
  • 标准编码与算法
  • Python获取变量名本身​​——varname库
  • 专业站全返利网站建设
  • 网站设计提案安阳市建设工程领域网站
  • 鸿蒙(OpenHarmony)声明式 UI 开发入门:从「智慧校园」项目学基础语法
  • js移动开发框架
  • 【腾讯拥抱开源】Youtu-Embedding:基于CoDiEmb的一个协作而独特的框架,用于信息检索与语义文本相似性中的统一表征学习
  • 西蔵自治区建设厅网站wordpress防盗链插件
  • VSCode中使用conda activate 虚拟环境,没报错,但没进入环境
  • vue修改element-ui的默认的class
  • ModuleNotFoundError: No module named ‘UI_xiangmu‘
  • 网站建设方案及报价霍州做网站
  • mybatis-generator插件自动生成mapper及其实体模型配置
  • 计算机毕业设计 基于k-means的校园美食推荐系统 Python 大数据毕业设计 Hadoop毕业设计选题【附源码+文档报告+安装调试】
  • 【代码大模型-后门安全】Backdoors in Neural Models of Source Code
  • javaweb后端优雅处理枚举
  • 帝国cms小程序搞起来简直好用的不行
  • 高效批量调整图像尺寸的方案
  • 单片机供电处3.3V大电容导致程序可进调试但是无法暂停到具体语句
  • Java 实战:为 Word 文档中的文本与段落添加边框
  • 创业网站怎么做网站建设与网页设计...
  • git大文件储存机制是什么-为什么有大文件会出错并且处理大文件非常麻烦-优雅草卓伊凡
  • 机器学习之规则学习(Rule Learning)
  • 【神经网络】从逻辑回归到神经网络
  • 工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
  • 做外贸怎么看外国网站wordpress配置邮件发送
  • 使用Python对PDF进行拆分与合并
  • 嵌入式软件/硬件工程师面试答案