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…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
