fs 文件系统模块

在 Node.js 中,fs(File System)模块提供了与文件系统进行交互的能力。无论是读取、写入还是操作文件和目录,fs 模块都提供了丰富的 API 支持。本文将详细介绍 fs 模块的基本用法、异步与同步方法的区别以及一些高级功能,帮助你更好地掌握这一重要模块。

什么是 fs 模块?

基本概念

fs 是 Node.js 核心模块之一,它允许开发者通过 JavaScript 访问和操作计算机的文件系统。这个模块包含了用于处理文件的各种函数,包括读取文件内容、创建新文件、更新现有文件、删除文件等操作。

模块导入

要在项目中使用 fs 模块,首先需要通过 require 函数将其导入:

const fs = require('fs');

异步 vs 同步

异步方法

Node.js 的设计理念之一是异步 I/O,这使得它可以高效地处理并发请求。大多数 fs 方法都有对应的异步版本,它们通常接受一个回调函数作为最后一个参数,当操作完成时会调用该回调函数,并传入可能发生的错误或结果数据。

例如,读取文件的异步方法如下所示:

fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log(data);
});

同步方法

除了异步方法外,fs 模块还提供了一系列同步方法。这些方法的名字通常以 Sync 结尾,如 readFileSync。使用同步方法时,程序会在当前操作完成之前暂停执行,直到返回结果为止。

try {const data = fs.readFileSync('example.txt', 'utf8');console.log(data);
} catch (err) {console.error(err);
}

尽管同步方法编写起来更加直观,但由于它们会阻塞事件循环,因此在生产环境中应尽量避免使用。

常用方法概览

文件读取

  • 异步读取fs.readFile(path[, options], callback)
  • 同步读取fs.readFileSync(path[, options])

示例:

// 异步读取
fs.readFile('example.txt', 'utf8', (err, data) => {if (err) throw err;console.log(data);
});// 同步读取
const data = fs.readFileSync('example.txt', 'utf8');
console.log(data);

文件写入

  • 异步写入fs.writeFile(file, data[, options], callback)
  • 同步写入fs.writeFileSync(file, data[, options])

示例:

// 异步写入
fs.writeFile('output.txt', 'Hello World!', (err) => {if (err) throw err;console.log('The file has been saved!');
});// 同步写入
fs.writeFileSync('output.txt', 'Hello World!');
console.log('The file has been saved!');

文件信息获取

  • 异步获取fs.stat(path, callback)
  • 同步获取fs.statSync(path)

示例:

// 异步获取
fs.stat('example.txt', (err, stats) => {if (err) throw err;console.log(`Is file: ${stats.isFile()}`);console.log(`Size: ${stats.size} bytes`);
});// 同步获取
const stats = fs.statSync('example.txt');
console.log(`Is file: ${stats.isFile()}`);
console.log(`Size: ${stats.size} bytes`);

高级特性

流式处理

对于大文件的操作,直接读取整个文件可能会导致内存溢出问题。此时可以使用流(Stream)来分块读取或写入文件。

const readStream = fs.createReadStream('largefile.txt');
readStream.on('data', (chunk) => {console.log(`Received ${chunk.length} bytes of data.`);
});readStream.on('end', () => {console.log('There will be no more data.');
});

Promise 和 Async/Await

为了简化异步代码的书写,可以结合 Promise 或者 async/await 来处理 fs 操作。

// 使用 Promise
const util = require('util');
const readFile = util.promisify(fs.readFile);readFile('example.txt', 'utf8').then(data => {console.log(data);
}).catch(err => {console.error(err);
});// 使用 async/await
async function readFileAsync() {try {const data = await readFile('example.txt', 'utf8');console.log(data);} catch (err) {console.error(err);}
}readFileAsync();

结语

感谢您的阅读!如果您对 Node.js 的 fs 模块或其他相关话题有任何疑问或见解,欢迎继续探讨。

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

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

相关文章

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…

Vim 多窗口编辑及文件对比

水平分割 :split 默认使用水平分割的方式。 :split :sp 垂直分割 :vsplit :vs 带文件的分割 :split 文件名 :sp 文件名 在光标所在的窗口,输入分割窗口命令就会对那个窗口进行分割。 切换窗口 Ctrlw 切换正在编辑的窗口 快速分割窗口 Ctrlwn 快速分割当前…

yolov11模型在Android设备上运行【踩坑记录】

0) 参考资料: https://github.com/Tencent/ncnn?tabreadme-ov-file https://github.com/pnnx/pnnx https://github.com/nihui/ncnn-android-yolov5 https://github.com/Tencent/ncnn?tabreadme-ov-file 1) :将xxx.pt模型转化成 xxx.onnx ONNX(Ope…

电商平台的设计与实现(代码+数据库+LW)

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统商品交易信息管理难度大,容错率低&#xff0…

学习笔记:机器学习中的数学原理(一)

1. 集合 集合分为有限集和无限集; 对于有限集,两集合元素数相等即为等势; 对于无限集,两集合元素存在一一映射关系即为等势; 无限集根据是否与正整数集等势分为可数集和不可数集。 2. sigmoid函数(也叫…

【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命

目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…

互联网分布式ID解决方案

业界实现方案 1. 基于UUID 2. 基于DB数据库多种模式(自增主键、segment) 3. 基于Redis 4. 基于ZK、ETCD 5. 基于SnowFlake 6. 美团Leaf(DB-Segment、zkSnowFlake) 7. 百度uid-generator() 基于UUID生成唯一ID UUID生成策略 推荐阅读 DDD领域驱动与微服务架构设计设计模…

使用Python实现PDF与SVG相互转换

目录 使用工具 使用Python将SVG转换为PDF 使用Python将SVG添加到现有PDF中 使用Python将PDF转换为SVG 使用Python将PDF的特定页面转换为SVG SVG(可缩放矢量图形)和PDF(便携式文档格式)是两种常见且广泛使用的文件格式。SVG是…

CV(11)-图像分割

前言 仅记录学习过程,有问题欢迎讨论 图像分割 语义分割不需要区分具体的个体,实例分割需要 反卷积/转置卷积: 它并不是正向卷积的完全逆过程。反卷积是一种特殊的正向卷积,先按照一定的比例通过补0 来扩大输入图像的尺寸&…

封装descriptions组件,描述,灵活

效果 1、组件1&#xff0c;dade-descriptions.vue <template><table><tbody><slot></slot></tbody> </table> </template><script> </script><style scoped>table {width: 100%;border-collapse: coll…

【Elasticsearch】terms聚合误差问题

Elasticsearch中的聚合查询在某些情况下确实可能存在误差&#xff0c;尤其是在处理分布式数据和大量唯一值时。这种误差主要来源于以下几个方面&#xff1a; 1.分片数据的局部性 Elasticsearch的索引通常被分成多个分片&#xff0c;每个分片独立地计算聚合结果。由于数据在分…

Android修行手册-五种比较图片相似或相同

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材…

2、k8s的cni网络插件和基本操作命令

kube-prxoy属于节点组件&#xff0c;网络代理&#xff0c;实现服务的自动发现和负载均衡。 k8s的内部网络模式 1、pod内的容器于容器之间的通信。 2、一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。 3、不同节点上的pod之间的通信&#xff1a; 通过物理网卡的…

全排列问题(LeetCode 46 47)

1 全排列问题 本篇文章主要介绍了全排列问题以及详细的解法。 给定一个数组求出其中的全排列。 其中的数组&#xff0c;可能带重复元素&#xff0c;也可能不带重复元素。 有详细思路以及递归树图解&#xff0c;语言包括C、Java和Go。 下面先来看看简单的版本&#xff0c;不带…

11.PPT:世界动物日【25】

目录 NO12​ NO34 NO56​ NO789视频音频​ NO10/11/12​ NO12 设计→幻灯片大小→ →全屏显示&#xff08;16&#xff1a;9&#xff09;确定调整标题占位符置于图片右侧&#xff1a;内容占位符与标题占位符左对齐单击右键“世界动物日1”→复制版式→大小→对齐 幻灯片大小…

【漫话机器学习系列】083.安斯库姆四重奏(Anscombe‘s Quartet)

安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09; 1. 什么是安斯库姆四重奏&#xff1f; 安斯库姆四重奏&#xff08;Anscombes Quartet&#xff09;是一组由统计学家弗朗西斯安斯库姆&#xff08;Francis Anscombe&#xff09; 在 1973 年 提出的 四组数据集。它们…

Postman接口测试:全局变量/接口关联/加密/解密

全局变量和环境变量 全局变量&#xff1a;在postman全局生效的变量&#xff0c;全局唯一 环境变量&#xff1a;在特定环境下生效的变量&#xff0c;本环境内唯一 设置&#xff1a; 全局变量&#xff1a; pm.globals.set("variable_key", "variable_value1&q…

ZZNUOJ(C/C++)基础练习1081——1090(详解版)

目录 1081 : n个数求和 &#xff08;多实例测试&#xff09; C C 1082 : 敲7&#xff08;多实例测试&#xff09; C C 1083 : 数值统计(多实例测试) C C 1084 : 计算两点间的距离&#xff08;多实例测试&#xff09; C C 1085 : 求奇数的乘积&#xff08;多实例测试…

STM32的HAL库开发---高级定时器

一、高级定时器简介 1、STM32F103有两个高级定时器&#xff0c;分别是TIM1和TIM8。 2、主要特性 16位递增、递减、中心对齐计数器(计数值:0~65535)16位预分频器(分频系数:1~65536)可用于触发DAC、ADC在更新事件、触发事件、输入捕获、输出比较时&#xff0c;会产生中断/DMA请…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭&#xff5e; ??? 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。?? 希望在这里&#xff0c;我们能一起探…