Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程
学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手
文章目录
- 📚文件写入
- 🐇writeFile 异步写入
- 🐇writeFileSync 同步写入
- 🐇appendFile / appendFileSync 追加写入
- 🐇createWriteStream 流式写入
- 🐇写入文件的场景
- 📚文件读取
- 🐇 readFile 异步读取
- 🐇readFileSync 同步读取
- 🐇createReadStream 流式读取
- 🐇fs文件练习——文件复制
- 📚文件移动与重命名
- 📚文件删除
- 📚文件夹操作
- 🐇mkdir 创建文件夹
- 🐇readdir 读取文件夹
- 🐇rmdir 删除文件夹
- 🐇fs文件练习——批量重命名
- 📚查看资源状态
- 📚相对路径问题
- 📚_dirname全局变量
- fs:
file system
,文件系统。- fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动、内容的写入读取以及文件夹的相关操作。
📚文件写入
🐇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;}console.log('写入成功'); });
-
异步
:如下,1+1在最后,但它压根不带等上边的,它俩一块运行,谁也不妨碍谁,1+1先跑完就先输出。/*** 需求:* 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉*///1. 导入 fs 模块 const fs = require('fs');//2. 写入文件 fs.writeFile('./座右铭.txt', '三人行, 则必有我师焉', err => {// err(回调函数)写入失败: 错误对象 写入成功: nullif(err){console.log('写入失败');return;}console.log('写入成功'); });console.log(1 + 1);
🐇writeFileSync 同步写入
-
语法:
fs.writeFileSync(file, data[, options])
-
参数与 fs.writeFile 大体一致,只是没有 callback 参数。
-
返回值:
undefined
//1. 导入 fs 模块 const fs = require('fs');//2. 写入文件 //同步写入 fs.writeFileSync('./data.txt', 'test'); console.log(1 + 1);
-
同步
:就是一条道,我走完你再走,从上到下顺序执行。/*** 需求:* 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉*///1. 导入 fs 模块 const fs = require('fs');//2. 写入文件 //同步写入 try{fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');console.log('OK'); } catch(e){console.log(e); } console.log(1 + 1);
Node.js 中的磁盘操作是由其他线程完成的,结果的处理有两种模式:
同步处理
:JavaScript主线程会等待其他线程的执行结果,然后再继续执行主线程的代码,效率较低。异步处理
:JavaScript主线程不会等待其他线程的执行结果,直接执行后续的主线程代码,效率较好。
🐇appendFile / appendFileSync 追加写入
-
appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同。
-
语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
-
返回值: 二者都为
undefined
//1. 引入 fs 模块 const fs = require('fs');//2. 调用 appendFile fs.appendFile('./座右铭.txt', ',择其善者而从之, 择期不善者而改之', err => {//判断if(err){console.log('写入失败~~');return;}console.log('追加写入成功'); });fs.appendFileSync('./座右铭.txt', '\r\n温故而知新, 可以为师矣')//writeFile 实现追加写入 fs.writeFile('./座右铭.txt', 'love love love',{flag: 'a'}, err => {if(err) {console.log('写入失败~');return ;}console.log('写入成功'); });
🐇createWriteStream 流式写入
- 语法:
fs.createWriteStream(path[, options])
- 参数说明:
path
:文件路径options
:选项配置( 可选 )
- 返回值:
Object
//1. 导入 fs const fs = require('fs');//2. 创建写入流对象 const ws = fs.createWriteStream('./观书有感.txt');//3. write ws.write('半亩方塘一鉴开\r\n'); ws.write('天光云影共徘徊\r\n'); ws.write('问渠那得清如许\r\n'); ws.write('为有源头活水来\r\n');//4. 关闭通道 ws.close();
- 程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。
- 流式写入方式适用于大文件写入或者频繁写入的场景, writeFile 适合于写入频率较低的场景。
🐇写入文件的场景
📚文件读取
🐇 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
:文件路径options
:选项配置( 可选 )
-
返回值:
Object
//1. 引入 fs 模块 const fs = require('fs');//2. 创建读取流对象 const rs = fs.createReadStream('../资料/笑看风云.mp4');//3. 绑定 data 事件 chunk 块儿 大块儿 rs.on('data', chunk => {console.log(chunk.length); // 65536 字节 => 64KB,每次读取64KB的数据 });//4. end 可选事件 rs.on('end', () => {console.log('读取完成'); });
- 读取文件应用场景
🐇fs文件练习——文件复制
/*** 需求:* 复制『资料』文件夹下的『笑看风云.mp4』*/
const fs = require('fs');//方式一 readFile
//读取文件内容
let data = fs.readFileSync('../资料/笑看风云.mp4');
//写入文件
fs.writeFileSync('../资料/笑看风云-2.mp4', data);//方式二 流式操作
//创建读取流对象
const rs = fs.createReadStream('../资料/笑看风云.mp4');
//创建写入流对象
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');//绑定 data 事件
rs.on('data', chunk => {ws.write(chunk);
});
查看内存占用量
const fs = require('fs');
const process = require('process');//方式一 readFile
let data = fs.readFileSync('../资料/笑看风云.mp4');
fs.writeFileSync('../资料/笑看风云-2.mp4', data);
console.log("我是readfile的结果");
console.log(process.memoryUsage()); //方式二 流式操作
const rs = fs.createReadStream('../资料/笑看风云.mp4');
const ws = fs.createWriteStream('../资料/笑看风云-3.mp4');//绑定 data 事件(2.1)
rs.on('data', chunk => {ws.write(chunk);
});rs.on('end', () => {console.log("我是流式读取的结果");console.log(process.memoryUsage());
})//(2.2),借助管道完成读取
// rs.pipe(ws);
视频里头流式处理可厉害了,我这咋流式处理菜菜的?- 流式处理所占用的内存比直接读取更大是因为流式处理需要在处理数据时逐行或逐块读取数据,并将其存储在内存中以进行后续处理。这意味着在读取数据时,需要维护一个缓冲区来存储数据,因此在处理大量数据时,内存的使用率可能比直接读取更高。
- 另外,流式处理还需要在处理后及时释放内存,否则可能会导致内存泄漏和程序崩溃等问题。因此,在设计流式处理程序时需要特别注意内存的使用和释放问题,以确保程序的稳定性和可靠性。
📚文件移动与重命名
- 在 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('操作成功'); });//文件的移动 fs.rename('./data.txt', '../资料/data.txt', err => {if(err) {console.log('操作失败~');return;}console.log('操作成功'); })
📚文件删除
- 在 Node.js 中,我们可以使用
unlink
或unlinkSync
或rm
或rmSync
来删除文件。 - 语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rm(path, callback)
fs.rmSync(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('./论语.txt', err => {if (err) {console.log('删除失败~');return;}console.log('删除成功'); })
📚文件夹操作
补充笔记:常用的 Linux 操作
🐇mkdir 创建文件夹
- 在 Node.js 中,我们可以使用
mkdir
或mkdirSync
来创建文件夹 - 语法:
fs.mkdir(path[, options], callback)
fs.mkdirSync(path[, options])
- 参数说明:
path
:文件夹路径options
:选项配置( 可选 )callback
:操作后的回调
🐇readdir 读取文件夹
- 在 Node.js 中,我们可以使用
readdir
或readdirSyn
来创建文件夹 - 语法:
fs.readdir(path[, options], callback)
fs.readdirSync(path[, options])
- 参数说明:
path
:文件夹路径options
:选项配置( 可选 )callback
:操作后的回调
🐇rmdir 删除文件夹
- 在 Node.js 中,我们可以使用
rmdir
或rmdirSync
来创建文件夹 - 语法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
- 参数说明:
path
:文件夹路径options
:选项配置( 可选 )callback
:操作后的回调
//1. 导入 fs 模块
const fs = require('fs');//2. 创建文件夹 mk make 制作 dir directory 文件夹
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('创建成功');
});//2-3 读取文件夹 read 读取 dir directory 文件夹
fs.readdir('../资料', (err, data) => {if(err){console.log('读取失败');return;}console.log(data);
});fs.readdir('./', (err, data) => {if(err){console.log('读取失败');return;}console.log(data);
});//2-4 删除文件夹 rm remove 移除
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('删除成功');
});
🐇fs文件练习——批量重命名
-
需求:批量重命名,把1、2等变为01、02等,可应用于防止网盘文件错位。
//导入 fs 模块 const fs = require('fs');//读取 code 文件夹 const files = fs.readdirSync('./code');//遍历数组 files.forEach(item => {//拆分文件名let data = item.split('-');let [num, name] = data;//num存数字,name存文件名//判断if(Number(num) < 10){num = '0' + num;}//创建新的文件名let newName = num + '-' + name;//重命名fs.renameSync(`./code/${item}`, `./code/${newName}`); })
-
需求:批量重命名并排好序,比如1、3、4变为01、02、03。
//导入 fs 模块 const fs = require('fs');//读取 code 文件夹 const files = fs.readdirSync('./code');//遍历数组 files.forEach((item, index) => {//拆分let [num, name] = item.split('-');//index 自增index++;//判断index = index < 10 ? '0' + index : index;//拼接新的名字let newName = index + '-' + name;//移动文件fs.renameSync(`./code/${item}`, `./code/${newName}`); });
📚查看资源状态
-
在 Node.js 中,我们可以使用
stat
或statSync
来创建文件夹 -
语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
-
参数说明:
path
:文件夹路径options
:选项配置( 可选 )callback
:操作后的回调
//1. 导入 fs 模块 const fs = require('fs');//2. stat 方法 status 缩写 状态 fs.stat('../资料/笑看风云.mp4', (err, data) => {if(err){console.log('操作失败');return;}console.log(data);console.log(data.isFile());console.log(data.isDirectory()); });
size
文件体积birthtime
创建时间mtime
最后修改时间isFile
检测是否为文件isDirectory
检测是否为文件夹
📚相对路径问题
学习html图片标签时对相对路径问题有过介绍
📚_dirname全局变量
__dirname
与require
类似,都是 Node.js 环境中的全局变量__dirname
保存着当前文件所在目录的绝对路径 ,可以使用__dirname
与文件名拼接成绝对路径
相关文章:

Node.js |(二)Node.js API:fs模块 | 尚硅谷2023版Node.js零基础视频教程
学习视频:尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手 文章目录 📚文件写入🐇writeFile 异步写入🐇writeFileSync 同步写入🐇appendFile / appendFileSync 追加写入🐇createWriteStrea…...
Android 13 Hotseat定制化修改——002 hotseat图标数量修改
目录 一.背景 二.实践方案 一.背景 由于需求是需要自定义修改Hotseat,所以此篇文章是记录如何自定义修改hotseat的,应该可以覆盖大部分场景,修改点有修改hotseat布局方向,hotseat图标数量,hotseat图标大小࿰…...

Flask实现接口mock,安装及使用教程(一)
1、什么是接口mock 主要是针对单元测试的应用,它可以很方便的解除单元测试中各种依赖,大大的降低了编写单元测试的难度 2、什么是mock server 正常情况下:测试客户端——测试——> 被测系统 ——依赖——>外部服务依赖 在被测系统和…...

分立式BUCK电路原理与制作持续更新
目录 一、分立式BUCK电路总体原理图 二、BUCK电路与LDO的区别 三、BUCK电路为什么要加电感 四、BUCK电路要加续流二极管 五、BUCK电路导通与断开的回路 六、电源公式的中的几个表示方式 1、输入功率用Pin表示 2、输出功率用Po表示 3、电源的效率公式:电源的…...

2023年大数据与计算国际会议 (WBDC 2023)| EI、Scoups检索
会议简介 Brief Introduction 2023年大数据与计算国际会议(WBDC 2023) 会议时间:2023年11月17 -19日 召开地点:中国西安 大会官网:www.iwbdc.org 2023年大数据与计算国际会议(WBDC 2023)将围绕“…...

Grafana V10 告警推送 邮件
最近项目建设完成,一个城域网项目,相关zabbix和grafana展示已经完,想了想,不想天天看平台去盯网络监控平台,索性对告警进行分类调整,增加告警的推送,和相关部门的提醒,其他部门看不懂…...
【OpenCV常用函数:视频捕获函数】cv2.VideoCapture
文章目录 1、cv2.VideoCapture() 1、cv2.VideoCapture() 输入视频路径,创建VideoCapture的对象 cv2.VideoCapture(filename) filename: 视频文件的路径视频名扩展名该类的函数有: 1)video.isOpened: 检查视频捕获是否成功 2)vid…...

OptaPlanner笔记2
1.5.3 使用maven 修改pom.xml 导入optaplanner-bom以避免为每一个依赖项重复添加版本号 <project>...<dependencyManagement><dependencies><dependency><groupId>org.optaplanner</groupId><artifactId>optaplanner-bom</art…...

c++文件流详细笔记
c++流 IO :向设备输入数据和输出数据 C++的IO流 设备: 文件控制台特定的数据类型(stringstream)c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出) 文件流 文件流: 对文件进行读写操作 头文件: 类库: ifstream 对文件输入(读文件) ofstream 对文件输出(写…...

CNN经典网络模型之GoogleNet论文解读
目录 1. GoogleNet 1.1 Inception模块 1.1.1 1x1卷积 1.2 辅助分类器结构 1.3 GoogleNet网络结构图 1. GoogleNet GoogleNet,也被称为Inception-v1,是由Google团队在2014年提出的一种深度卷积神经网络架构,专门用于图像分类和特征提取任…...

【C++】开源:CGAL计算几何库配置使用
😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍CGAL计算几何库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,…...
Redis分布式锁相关
Redis分布式锁实现Redisson 15问 分布式锁:Redisson源码解析-MultiLock、RedLock 看懂Redisson分布式锁源码,其实并不难...

Nginx环境搭建以及Docker环境部署
目录 Nginx环境搭建 1.首先创建Nginx的目录并进入 2.下载Nginx的安装包 可以通过FTP工具上传离线环境包,也可通过wget命令在线获取安装包 没有wget命令的可通过yum命令安装 3.解压Nginx的压缩包 4.下载并安装Nginx所需的依赖库和包 安装方式一 安装方式二 --- 也…...

2023牛客暑期多校训练营7(C/I/M)
目录 C.Beautiful Sequence I.We Love Strings M.Writing Books C.Beautiful Sequence 思路:显然若得到了a[1],则整个序列a我们都知道了。所以我们要求出第k大的a[1],这个可以利用序列a为不递减序列的性质来得出。 首先,由题…...

阿里云服务器手动搭建FTP教程(Windows操作系统)
阿里云百科介绍使用阿里云服务器搭建FTP教程,云服务器为Windows操作系统,当需要远程连接Windows实例进行文件传输时,可以通过搭建FTP站点实现。本文将介绍如何在Windows实例中搭建FTP站点。 目录 准备工作 步骤一:添加IIS以及F…...

idea+gradle阅读spring5.2.9源码之源码构建报错解决方案
注意 1、先确保gradle版本和spring、jdk版本对应 本文:gradle:5.6.4/spring 5.2.9/jdk1.8(gradle和jdk都要先安装好,gradle还要配置好本地资源文件路径) 2、原来项目乱了的话,先重新导入下载的源码项目 3、进入源码所在根目录&…...

一文详解Git
一. Git 概述 1.1 什么是 Git Git 是一个免费的、开源的分布式版本控制工具, 主要用于管理开发过程中的源代码文件,在软件开发过程中被广泛使用。通过Git仓库来存储和管理这些文件,Git仓库分为二种: 本地仓库:开发人…...

【单片机】DS2431英文手册,中文手册,翻译
DS2431是一款1024位的1-Wire EEPROM芯片,以每个256位的四个内存页面组织。数据被写入8字节的暂存区,经过验证,然后复制到EEPROM存储器中。作为一个特殊功能,四个内存页面可以单独地被写保护,或者被置于EPROM仿真模式&a…...

centos7部署openldap开启memberof并接入jumpserver
文章目录 前言1.yum安装openldap2.配置密码3.导入配置4.定义域5.配置memberof6.配置base dn7.安装phpldapadmin管理8.调整httpd的配置9.调整php的配置10.登陆php管理页面11.同步旧ldapsever用户数据(可省略)12.客户端配置13.对接jumpserver 前言 介绍如何在centos7上部署openl…...

Unity游戏源码分享-仿开心消消乐Match3Jewel
Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址: https://download.csdn.net/download/Highning0007/88198762...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...