Node.js开发-fs模块
这里写目录标题
- fs模块
- 1) 文件写入
- 2) 文件写入
- 3) 文件移动与重命名
- 4) 文件删除
- 5) 文件夹操作
- 6) 查看资源状态
- 7) 相对路径问题
- 8) __dirname
fs模块
fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取,以及文件夹的相关操作
1) 文件写入
文件写入就是将 数据
保存到 文件
中,可以使用如下几个方法来实现该效果
方法 | 说明 |
---|---|
writeFile | 异步写入 |
writeFileSync | 同步写入 |
appendFile / appendFileSync | 追加写入 |
createWriteStream | 流式写入 |
writeFile 异步写入
语法 fs.writeFile(file, data[, options], callback)
参数说明:
- file 文件名
- data 待写入的数据
- options 选项设置 (可选)
- callback 写入回调
返回值: undefined
/*** 需要:* 新建一个文件:座右铭.txt* 写入内容:三人行,则必有我师焉*/
// 1.导入fs模块
const fs = require('fs')// 2.写入文件
fs.writeFile('./座右铭.txt', "三人行,则必有我师焉", err => {// err 写入失败:错误对象, 写入成功:nullif (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});
writeFileSync 同步写入
语法: fs.writeFileSync(file, data[, options])
参数与 fs.writeFile
大体一致,只是没有 callback
参数
返回值: undefined
try{fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){console.log(e);
}
appendFile / appendFileSync 追加写入
appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同
语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
返回值: 二者都为 undefined
// 2.调用appendFile
fs.appendFile("./座右铭.txt", "\r\n择其善者而从之,。。。。", err=>{if (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});// 2.调用appendFileSync
fs.appendFileSync("./座右铭.txt", "\r\n温故而知新。。。")// 2.调用writeFile(追加或覆盖)
fs.writeFile("./座右铭.txt", "love love",{flag:'a'} ,err=>{if (err) {console.log("写入失败");return;} else {console.log("写入成功");}
});
createWriteStream 流式写入
语法: fs.createWriteStream(path[, options])
参数说明:
- path 文件路径
- options 选项配置( 可选 )
返回值: Object
/*** 观书有感.txt*/// 1.导入fs模块
const fs = require("fs");// 2.创建写入流对象
const ws = fs.createWriteStream("./观书有感.txt");// 3.write
ws.write("半亩方塘一鉴开\r\n");
ws.write("天光运功徘徊\r\n");// 4.关闭通道
ws.close();
程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于
大文件写入或者频繁写入
的场景, writeFile 适合于写入频率较低的场景
写入文件的场景
文件写入
在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
- 下载文件
- 安装软件
- 保存程序日志,如 Git
- 编辑器保存文件
- 视频录制
当
需要持久化保存数据
的时候,应该想到文件写入
2) 文件写入
文件读取顾名思义,就是通过程序从文件中取出其中的数据,可以使用如下几种方式:
方法 | 说明 |
---|---|
readFile | 异步读取 |
readFileSync | 同步读取 |
createReadStream | 流式读取 |
readFile 异步读取
语法: fs.readFile(path[, options], callback)
参数说明:
- path 文件路径
- options 选项配置
- callback 回调函数
返回值: undefined
// 1.引入fs模块
const fs = require("fs")// 2.异步读取
fs.readFile("./观书有感.txt", (err, data) => {if (err) {console.log("读取失败");return;}console.log(data.toString());
});
readFileSync 同步读取
语法: fs.readFileSync(path[, options])
参数说明:
- path 文件路径
- options 选项配置
返回值: string | Buffer
// 1.引入fs模块
const fs = require("fs")// 2.同步读取
let data = fs.readFileSync("./观书有感.txt");
console.log(data.toString());
createReadStream 流式读取
语法: fs.createReadStream(path[, options])
参数说明:
- path 文件路径
返回值: Object
// 1.引入fs模块
const fs = require("fs");// 2.读取流对象
const rs = fs.createReadStream("./观书有感.txt");// 3.绑定data事件
rs.on("data", chunk => {console.log(chunk);
});// 4.end
rs.on("end", () => {console.log("读取完成");
});
每次取出 64k 数据后执行一次 data 回调
读取完毕后, 执行 end 回调
读取文件应用场景
-
电脑开机
-
程序运行
-
编辑器打开文件
-
查看图片
-
播放视频
-
播放音乐
-
Git 查看日志
-
上传文件
-
查看聊天记录
3) 文件移动与重命名
在 Node.js 中,我们可以使用 rename
或 renameSync
来移动或重命名 文件或文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
-
oldPath 文件当前的路径
-
newPath 文件新的路径
-
callback 操作后的回调
// 1.导入fs模块
const fs = require("fs")// 2.调用rename方法
fs.rename("./座右铭.txt", "./我的新座右铭.txt", err => {if (err) {console.log("操作失败");return;}console.log("操作成功");
});
4) 文件删除
在 Node.js 中,我们可以使用 unlink
或 unlinkSync
来删除文件
语法:
-
fs.unlink(path, callback)
-
fs.unlinkSync(path)
参数说明:
-
path 文件路径
-
callback 操作后的回调
// 1.导入fs模块
const fs = require("fs")// 2.调用 unlink 方法 unlinkSync
fs.unlink("./观书有感.txt", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// 2.调用 rm 方法 rmSync
fs.rm("./data.txt", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});
5) 文件夹操作
借助 Node.js 的能力,我们可以对文件夹进行 创建 、 读取 、 删除
等操作
方法 | 说明 |
---|---|
mkdir / mkdirSync | 创建文件夹 |
readdir / readdirSync | 读取文件夹 |
rmdir / rmdirSync | 删除文件夹 |
mkdir 创建文件夹
在 Node.js 中,我们可以使用 mkdir 或 mkdirSync 来创建文件夹
语法:
-
fs.mkdir(path[, options], callback)
-
fs.mkdirSync(path[, options])
参数说明:
-
path 文件夹路径
-
options 选项配置( 可选 )
-
callback 操作后的回调
// 1.导入fs模块
const fs = require("fs")// 2-1.创建文件夹
fs.mkdir("./html", err => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});// 2-2.递归创建
fs.mkdir("./a/b/c", {recursive: true}, err => {if (err) {console.log("创建失败");return;}console.log("创建成功");
});
readdir 读取文件夹
在 Node.js 中,我们可以使用 readdir
或 readdirSync
来读取文件夹
语法:
-
fs.readdir(path[, options], callback)
-
fs.readdirSync(path[, options])
参数说明:
-
path 文件夹路径
-
options 选项配置( 可选 )
-
callback 操作后的回调
// 2-3 读取文件夹
fs.readdir("./", (err, data) => {if (err) {console.log("读取失败");return;}console.log("读取成功"+data);
});
rmdir 删除文件夹
在 Node.js 中,我们可以使用 rmdir
或 rmdirSync
来删除文件夹
语法:
-
fs.rmdir(path[, options], callback)
-
fs.rmdirSync(path[, options])
参数说明:
-
path 文件夹路径
-
options 选项配置( 可选 )
-
callback 操作后的回调
// 2-4 删除文件夹
fs.rmdir("./html", err => {if (err) {console.log("删除失败");return;}console.log("删除成功");
});// 递归删除-不推荐使用
fs.rmdir("./a", {recursive: true}, err => {if (err) {console.log("删除失败"+err);return;}console.log("删除成功");
});// 递归删除-推荐使用
fs.rm("./a", {recursive: true}, err => {if (err) {console.log("删除失败"+err);return;}console.log("删除成功");
});
6) 查看资源状态
在 Node.js 中,我们可以使用 stat
或 statSync
来查看资源的详细信息
语法:
-
fs.stat(path[, options], callback)
-
fs.statSync(path[, options])
参数说明:
-
path 文件夹路径
-
options 选项配置( 可选 )
-
callback 操作后的回调
// 1.导入fs模块
const fs = require("fs");// 2.调用 stat
fs.stat("./1-文件写入.js", (err, data) => {if (err) {console.log("操作失败");return;}console.log(data);console.log(data.isFile());console.log(data.isDirectory());
});
7) 相对路径问题
fs 模块对资源进行操作时,路径的写法有两种:
-
相对路径
./座右铭.txt
当前目录下的座右铭.txt座右铭.txt
等效于上面的写法../座右铭.txt
当前目录的上一级目录中的座右铭.txt
-
绝对路径
D:/Program Files windows
系统下的绝对路径/usr/bin Linux
系统下的绝对路径
相对路径中所谓的 当前目录 ,指的是 命令行的工作目录 ,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG
8) __dirname
__dirname
与 require
类似,都是 Node.js 环境中的’全局’变量
__dirname
保存着 当前文件所在目录的绝对路径
,可以使用 __dirname 与文件名拼接成绝对路径
代码示例:
let data = fs.readFileSync(__dirname + '/data.txt');
console.log(data);
使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的Bug
相关文章:
Node.js开发-fs模块
这里写目录标题 fs模块1) 文件写入2) 文件写入3) 文件移动与重命名4) 文件删除5) 文件夹操作6) 查看资源状态7) 相对路径问题8) __dirname fs模块 fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动等,还有文件内容的写入、读取ÿ…...

探索Nginx:强大的开源Web服务器与反向代理
一、引言 随着互联网的飞速发展,Web服务器在现代技术架构中扮演着至关重要的角色。Nginx(发音为“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…...

相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

【从Python基础到深度学习】1. Python PyCharm安装及激活
前言: 为了帮助大家快速入门机器学习-深度学习,从今天起我将用100天的时间将大学本科期间的所学所想分享给大家,和大家共同进步。【从Python基础到深度学习】系列博客中我将从python基础开始通过知识和代码实践结合的方式进行知识的分享和记…...

片上网络NoC(3)——拓扑指标
目录 一、概述 二、指标 2.1 与网络流量无关的指标 2.1.1 度(degree) 2.1.2 对分带宽(bisection bandwidth) 2.1.3 网络直径(diameter) 2.2 与网络流量相关的指标 2.2.1 跳数(hop coun…...
二叉树 ---- 所有结点数
普通二叉树的结点数: 递归法: 对二叉树进行前序or后序遍历: typedef struct Tree {int data;Tree* leftChild;Tree* rightChild; }tree,*linklist; //计算普通二叉树的结点数 int nodenums(linklist node) {if(node nullptr) return 0; …...

步步深入 k8s 使用 pv pvc sc 在 nfs 基础上共享存储
博客原文 文章目录 前言集群环境nfs 环境搭建pod 挂载 nfs架构图 pvc 方式挂载 nfs架构图 storageclass 方式动态申请 pv架构图 参考 前言 持久化卷(Persistent Volume, PV)允许用户将外部存储映射到集群,而持久化卷申请(Persist…...

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)
本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十...

Modelsim10.4安装
简介(了解,可跳过) modelsim是Mentor公司开发的优秀的HDL语言仿真软件。 它能提供友好的仿真环境,采用单内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术和单一内核仿真技术,编译仿真速…...

Java基于微信小程序的医院核酸检测服务系统,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

VC++ 绘制折线学习
win32 有三个绘制折线的函数; Polyline,根据给定点数组绘制折线; PolylineTo,除了绘制也更新当前位置; PolyPolyline,绘制多条折线,第一个参数是点数组,第二个参数是一个数组、指…...
速盾:dns解析和cdn加速的区别与联系
DNS解析和CDN加速是两种不同的网络技术,但在网站访问过程中起到了相互协作的作用。 首先,DNS解析(Domain Name System)是将域名转换为IP地址的过程。当用户输入一个网址时,计算机会先向本地DNS服务器发送一个查询请求…...

C++ Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(3) 保存表格数据
对上两篇篇的工作C Qt框架开发| 基于Qt框架开发实时成绩显示排序系统(1)-CSDN博客和C Qt框架开发 | 基于Qt框架开发实时成绩显示排序系统(2)折线图显示-CSDN博客继续优化,增加一个保存按钮,用于保存成绩数据…...
ChatGPT 4:新特性与优势
ChatGPT 4:新特性与优势 一、引言 ChatGPT 4是一款备受瞩目的人工智能模型,它以其强大的语言生成能力和智能回答能力,为用户提供了更高效、更便捷的对话体验。为了能够充分享受ChatGPT 4的各项功能,本文将向您详细介绍其新特性&…...

【教程】MySQL数据库学习笔记(二)——数据类型(持续更新)
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、整…...
Servo的并发模型介绍
Servo是一个由Mozilla Research开发的实验性浏览器引擎,旨在为未来的网页和应用程序提供高性能的渲染。Servo的并发模型是其核心特点之一,它利用现代多核处理器的优势,通过异步编程和并行处理来提高渲染效率和响应性。以下是对Servo并发模型的…...

Vue3大事件项目(ing)
文章目录 核心内容1.大事件项目介绍2.大事件项目创建3.Eslint配置代码风格4.配置代码检查工作流问题: pnpm lint是全量检查,耗时问题,历史问题 5.目录调整6.vue-router4 路由代码解析7.引入 Element Plus 组件库8.Pinia 构建仓库 和 持久化9.Pinia 仓库统一管理 核心内容 Vue3…...

基于spring boot实现邮箱发送和邮箱验证
目录 一、邮箱发送实现1. 开通邮箱服务2. 添加邮箱依赖3.添加配置4.添加邮箱通用类5. 测试类 二、邮箱验证实现1.添加依赖2. 添加配置3.添加controller4. 测试 项目地址: https://gitee.com/nssnail/springboot-email 一、邮箱发送实现 1. 开通邮箱服务 使用qq邮箱、163邮箱都…...

华清作业day56
SQLite特性: 零配置一无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由共享;支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB…...

【FPGA】VHDL:八段码到8421BCD码转换电路
目录 EDA设计基础练习题 : 实验要求如下: 代码 八段码到8421BCD码转换电路 8421BCD码到八段码转换电路 八段码到8421BCD~运行结果展示 8421BCD转八段码~运行结果展示 特别注意 软件:Quartus II 13.0 (64-bit) 语言:VHDL E…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...