1.3 fs模块详解

 fs 模块详解

Node.js 的 fs 模块提供了与文件系统交互的能力,是服务器端编程的核心模块之一。它支持同步、异步(回调式)和 Promise 三种 API 风格,可满足不同场景的需求。

1. 模块引入
const fs = require('fs');          // 回调式 API
const fsPromises = require('fs').promises; // Promise API
const fsSync = require('fs');      // 同步 API
2. 文件读取操作
异步回调方式
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) {console.error('读取文件失败:', err);return;}console.log('文件内容:', data);
});
Promise 方式
fsPromises.readFile('example.txt', 'utf8').then(data => console.log('文件内容:', data)).catch(err => console.error('读取文件失败:', err));// 或使用 async/await
async function readFileAsync() {try {const data = await fsPromises.readFile('example.txt', 'utf8');console.log('文件内容:', data);} catch (err) {console.error('读取文件失败:', err);}
}
同步方式
try {const data = fsSync.readFileSync('example.txt', 'utf8');console.log('文件内容:', data);
} catch (err) {console.error('读取文件失败:', err);
}
3. 文件写入操作
覆盖写入
// 异步
fs.writeFile('output.txt', 'Hello World!', err => {if (err) console.error('写入失败:', err);
});// Promise
fsPromises.writeFile('output.txt', 'Hello World!').then(() => console.log('写入成功')).catch(err => console.error('写入失败:', err));// 同步
fsSync.writeFileSync('output.txt', 'Hello World!');
追加写入
fs.appendFile('log.txt', '追加内容\n', err => { /* ... */ });
fsPromises.appendFile('log.txt', '追加内容\n');
fsSync.appendFileSync('log.txt', '追加内容\n');
4. 文件和目录操作
创建目录
// 递归创建多级目录(如 mkdir -p)
fs.mkdir('dir/subdir', { recursive: true }, err => { /* ... */ });
fsPromises.mkdir('dir/subdir', { recursive: true });
fsSync.mkdirSync('dir/subdir', { recursive: true });
读取目录
fs.readdir('dir', (err, files) => {console.log('目录内容:', files); // 返回文件名数组
});
重命名 / 移动文件
fs.rename('old.txt', 'new.txt', err => { /* ... */ });
fsPromises.rename('old.txt', 'new.txt');
fsSync.renameSync('old.txt', 'new.txt');
删除文件 / 目录
// 删除文件
fs.unlink('file.txt', err => { /* ... */ });
fsPromises.unlink('file.txt');
fsSync.unlinkSync('file.txt');// 删除目录(递归删除使用 { recursive: true })
fs.rmdir('dir', err => { /* ... */ });
fsPromises.rmdir('dir', { recursive: true });
fsSync.rmdirSync('dir', { recursive: true });
5. 文件状态检查
fs.stat('example.txt', (err, stats) => {if (err) return;console.log('是否为文件:', stats.isFile());console.log('是否为目录:', stats.isDirectory());console.log('文件大小:', stats.size, '字节');console.log('创建时间:', stats.ctime);
});// Promise 版本
fsPromises.stat('example.txt').then(stats => { /* ... */ });
6. 流式操作

适合处理大文件,避免内存溢出:

读取流
const readStream = fs.createReadStream('large_file.txt', {encoding: 'utf8',highWaterMark: 1024 * 1024 // 1MB 缓冲区
});readStream.on('data', chunk => {console.log('读取块:', chunk.length);
});readStream.on('end', () => console.log('读取完成'));
readStream.on('error', err => console.error('读取错误:', err));
写入流
const writeStream = fs.createWriteStream('output.txt');writeStream.write('第一部分内容');
writeStream.write('第二部分内容');
writeStream.end(); // 结束写入writeStream.on('finish', () => console.log('写入完成'));
管道操作(高效复制文件)
const readStream = fs.createReadStream('input.txt');
const writeStream = fs.createWriteStream('output.txt');readStream.pipe(writeStream); // 自动处理背压问题
7. 文件路径处理

通常配合 path 模块使用:

const path = require('path');const filePath = '/home/user/dir/file.txt';
console.log('文件名:', path.basename(filePath)); // 'file.txt'
console.log('目录:', path.dirname(filePath));    // '/home/user/dir'
console.log('扩展名:', path.extname(filePath));  // '.txt'
console.log('绝对路径:', path.resolve('file.txt')); // 解析为绝对路径
8. 监听文件变化
// 监听文件或目录变化
fs.watch('dir', (eventType, filename) => {console.log(`文件 ${filename} 发生 ${eventType} 事件`);
});
9. 同步 vs 异步 vs Promise
类型适用场景特点
同步 API配置加载、脚本工具阻塞执行,可能导致性能问题
回调 API传统异步场景需处理回调地狱问题
Promise API现代异步代码(async/await)避免回调地狱,支持链式调用
10. 最佳实践
  1. 优先使用异步 API:Node.js 是单线程的,同步操作会阻塞整个事件循环。
  2. 错误处理:始终处理文件操作可能抛出的错误。
  3. 大文件处理:使用流 API 处理大文件,避免内存溢出。
  4. 路径安全:使用 path 模块处理路径,避免路径遍历攻击。
  5. Promise 化:若需使用回调 API,可用 util.promisify 转换为 Promise:
    const { promisify } = require('util');
    const readFile = promisify(fs.readFile);
    
11. 注意事项
  • 文件权限:确保 Node.js 进程有足够权限访问文件。
  • 跨平台兼容性:Windows 和 Unix 系统的路径分隔符不同,使用 path 模块处理。
  • 性能考量:频繁的文件操作可能成为性能瓶颈,考虑缓存策略。

总结

fs 模块是 Node.js 核心能力之一,提供了丰富的文件系统操作接口。根据场景选择合适的 API 风格(同步、回调或 Promise),并遵循最佳实践以确保代码健壮性和性能。对于复杂操作,推荐使用 Promise API 和 async/await 语法提高代码可读性。

const fs = require('fs').promises;async function example() {try {const data = await fs.readFile('<file-path>', 'utf8');console.log(data);await fs.writeFile('<new-file-path>', '一些内容');console.log('文件已保存');} catch (err) {console.error(err);}
}example();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/83675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 70 爬楼梯(Java)

爬楼梯问题&#xff1a;动态规划与斐波那契的巧妙结合 问题描述 假设你正在爬楼梯&#xff0c;需要爬 n 阶才能到达楼顶。每次你可以爬 1 或 2 个台阶。求有多少种不同的方法可以爬到楼顶&#xff1f; 示例&#xff1a; n 2 → 输出 2&#xff08;1阶1阶 或 2阶&#xff0…

【学习分享】shell基础-参数传递

参数传递 我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为 $n&#xff0c;n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数。 例如可以使用 $1、$2 等来引用传递给脚本的参数&#xff0…

Fluence推出“Pointless计划”:五种方式参与RWA算力资产新时代

2025年6月1日&#xff0c;去中心化算力平台 Fluence 正式宣布启动“Pointless 计划”——这是其《Fluence Vision 2026》战略中四项核心举措之一&#xff0c;旨在通过贡献驱动的积分体系&#xff0c;激励更广泛的社区参与&#xff0c;为用户带来现实世界资产&#xff08;RWA&am…

Excel数据分析:基础

在现代办公环境中&#xff0c;Excel 是一款不可或缺的工具&#xff0c;它是 Microsoft&#xff08;微软&#xff09;开发的电子表格软件&#xff0c;用于处理和分析结构化数据。市场上还有其他类似的软件&#xff0c;如 Google Sheets 和 Apple Numbers&#xff0c;但 Excel 以…

12V降5V12A大功率WD5030A,充电器、便携式设备、网络及工业领域的理想选择

WD5030A 高效单片同步降压型直流 / 直流转换器 一、芯片核心概述 WD5030A 是一款高性能同步降压型 DC/DC 转换器&#xff0c;采用 平均电流模式控制架构&#xff08;带频率抖动功能&#xff09;&#xff0c;具备以下核心优势&#xff1a; 精准电流控制&#xff1a;快速响应负…

企业级AI迈入黄金时代,企业该如何向AI“蝶变”?

科技云报到原创。 近日&#xff0c;微软&#xff08;MSFT.US&#xff09;在最新全员大会上高调展示企业级AI业务进展&#xff0c;其中与巴克莱银行达成的10万份Copilot许可证交易成为焦点。 微软首席商务官贾德森阿尔索夫在会上披露&#xff0c;这家英国金融巨头已签约采购相…

Java编程课(一)

Java编程课 一、java简介二、Java基础语法2.1 环境搭建2.2 使用Intellij IDEA新建java项目2.3 Java运行介绍2.4 参数说明2.5 Java基础语法2.6 注释2.7 变量和常量一、java简介 Java是一种广泛使用的高级编程语言,最初由Sun Microsystems于1995年发布。它被设计为具有简单、可…

【Java Web】速通Tomcat

参考笔记:JavaWeb 速通Tomcat_tomcat部署java项目-CSDN博客 目录 一、Tomcat服务 1. 下载和安装 2. 启动Tomcat服务 3. 启动Tomcat服务的注意事项 4. 关闭Tomcat服务 二、Tomcat的目录结构 1. bin 🌟 2. conf 🌟 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web项目…

Mysql 身份认证绕过漏洞 CVE-2012-2122

前言&#xff1a;CVE-2012-2122 是一个影响 MySQL 和 MariaDB 的身份验证漏洞&#xff0c;存在于特定版本中 vulhub/mysql/CVE-2012-2122/README.zh-cn.md at master vulhub/vulhubhttps://github.com/vulhub/vulhub/blob/master/mysql/CVE-2012-2122/README.zh-cn.md 任务一…

Win10停更,Win11不好用?现在Mac电脑比Win11电脑更便宜

最近不少朋友在换电脑前都犯了难。 以前大家最常说的一句是&#xff1a;“Mac太贵了&#xff0c;还是买Windows吧。”但现在不一样了&#xff0c;国补教育优惠下来&#xff0c;新款M4芯片的Mac mini的入门价已经降到了3000元左右&#xff0c;曾经的价格壁垒&#xff0c;已经不…

C#中Struct与IntPtr转换:实用扩展方法

C#中Struct与IntPtr转换&#xff1a;实用扩展方法 在 C# 编程的世界里&#xff0c;我们常常会遇到需要与非托管代码交互&#xff0c;或者进行一些底层内存操作的场景。这时&#xff0c;IntPtr类型就显得尤为重要&#xff0c;它可以表示一个指针或句柄&#xff0c;用来指向非托…

手机归属地查询接口如何用Java调用?

一、什么是手机归属地查询接口&#xff1f; 是一种便捷、高效的工具&#xff0c;操作简单&#xff0c;请求速度快。它不仅能够提高用户填写地址的效率&#xff0c;还能帮助企业更好地了解客户需求&#xff0c;制定个性化的营销策略&#xff0c;降低风险。随着移动互联网的发展…

43、视图解析-Thymeleaf初体验

43、视图解析-Thymeleaf初体验 “43、视图解析-Thymeleaf初体验”通常是指在学习Spring Boot框架时&#xff0c;关于如何使用Thymeleaf模板引擎进行视图解析的入门课程或章节。以下是对该主题的详细介绍&#xff1a; #### Thymeleaf简介 - **定义**&#xff1a;Thymeleaf是一个…

Day 40训练

Day 40 训练 PyTorch 图像数据训练与测试的规范写法单通道图像的规范训练流程数据预处理与加载模型定义训练与测试函数封装模型训练执行 彩色图像的扩展应用数据预处理调整模型结构调整 关键要点总结 知识点回顾&#xff1a; 彩色和灰度图片测试和训练的规范写法&#xff1a;封…

杰理可视化SDK--系统死机异常调试

杰理可视化SDK--系统死机异常调试 系统异常原因杰理SDK异常调试准备工作杰理SDK系统异常定位异常代码示例1异常代码示例2 在使用杰理可视化SDK进行软件开发时&#xff0c;往往会遇到一些系统异常问题&#xff0c;系统异常是指芯片在运行代码时&#xff0c;由于软件或硬件状态出…

图简记。。

模仿&#xff1a; algorithm-journey/src/class059/Code01_CreateGraph.java at main algorithmzuo/algorithm-journey Code01_CreateGraph C语言&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAXN 11 #define MAX…

Linux 常用命令与 Shell 简介

文章目录 **Linux 常用命令与 Shell 简介****Shell 简介****什么是 Shell&#xff1f;****Shell 的工作原理****常见 Shell 类型****命令行基础****Tab 补全与通配符** **Linux 常用命令****1. 入门必备命令****1.1 寻求帮助 - man 命令****1.2 用户间切换 - su 命令****1.3 特…

基于51单片机的超声波智能避障小车仿真

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;超声波实时测量小车与障碍物间的距离&#xff0c;并用LCD1602显示。 &#xff08;2&#xff09;当测得的距离超过50时&#xff0c;前进电机转动&#xff08;模拟后轮&#…

AIGC工具平台-GPT-SoVITS-v4-TTS音频推理克隆

声音克隆与语音合成的结合&#xff0c;是近年来生成式AI在多模态方向上的重要落地场景之一。随着预训练模型能力的增强&#xff0c;结合语音识别、音素映射与TTS合成的端到端系统成为初学者可以上手实践的全流程方案。 围绕 GPT-SoVITS-v4-TTS 模块&#xff0c;介绍了其在整合…

Android7 Input(十)View 处理Input事件pipeline

概述: 本文主要描述View对InputEvent事件pipeline处理过程。 本文涉及的源码路径 frameworks/base/core/java/android/view/ViewRootImpl.java InputEvent事件处理 View处理input事件是调用doProcessInputEvents方法&#xff0c;如下所示: void doProcessInputEvents() {//…