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全局变量

在这里插入图片描述

  • fsfile 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 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹
  • 语法
    • 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 中,我们可以使用unlinkunlinkSyncrmrmSync来删除文件。
  • 语法
    • 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 中,我们可以使用 mkdirmkdirSync来创建文件夹
  • 语法
    • fs.mkdir(path[, options], callback)
    • fs.mkdirSync(path[, options])
  • 参数说明
    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调

🐇readdir 读取文件夹

  • 在 Node.js 中,我们可以使用 readdirreaddirSyn 来创建文件夹
  • 语法
    • fs.readdir(path[, options], callback)
    • fs.readdirSync(path[, options])
  • 参数说明
    • path:文件夹路径
    • options:选项配置( 可选 )
    • callback:操作后的回调

🐇rmdir 删除文件夹

  • 在 Node.js 中,我们可以使用 rmdirrmdirSync来创建文件夹
  • 语法
    • 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 中,我们可以使用 statstatSync来创建文件夹

  • 语法

    • 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全局变量

  • __dirnamerequire类似,都是 Node.js 环境中的全局变量
  • __dirname保存着当前文件所在目录的绝对路径 ,可以使用 __dirname与文件名拼接成绝对路径
    在这里插入图片描述

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

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

相关文章

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

elementui实现当前页全选+所有全选+翻页保持选中状

原文来自&#xff1a;https://blog.csdn.net/sumimg/article/details/121693305?spm1001.2101.3001.6650.1&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-121693305-blog-127570059.235%5Ev38%5Epc_relevant_anti_t3&depth_1-utm…

Linux —— 文件系统

目录 一&#xff0c;背景 二&#xff0c;文件系统 一&#xff0c;磁盘简介 磁盘分为SSD、机械磁盘&#xff1b;机械磁盘&#xff0c;即磁盘高速转动&#xff0c;磁头移动到读写扇区所在磁道&#xff0c;让磁头在目标扇区上划过&#xff0c;即可完成对扇区的读写操作&#xff…

nacos升级开启鉴权后,微服务无法连接的解决方案

版本&#xff1a; 软件版本号备注spring boot2.2.5.RELEASEspring-cloudHoxton.SR3spring-cloud-alibaba2.2.1.RELEASEnacos2.0.1从1.4.2版本进行升级。同时作为注册中心和配置中心 一、升级nacos版本&#xff0c;开启鉴权 1.在application.properties配置文件开启鉴权&…

thinkphp:分组查询(多条相同列的数据只展示一条)

例子&#xff1a;数据库中有trans_num、subinventory_from、transaction_type、creation_date有相同值&#xff0c;在查询该数据库使&#xff0c;只展示这几个值相同的一条 效果&#xff1a; 限制之前 限制之后 代码 限制前&#xff0c;后端代码 public function select_i…

Java之继承

继承 继承为什么使用继承继承是什么继承的语法访问父类成员访问父类成员变量访问父类成员方法 super关键字子类构造方法super和this异同分别的使用方法 继承的方式final关键字 作者简介&#xff1a; zoro-1&#xff0c;目前大一&#xff0c;正在学习Java&#xff0c;数据结构等…

微服务监控技术skywalking的部署与使用(亲测无坑)

微服务监控技术skywalking的部署与使用 1. 前期准备2. skywalking安装部署2.1 Java Agent2.2 apache/skywalking-oap-server2.3 apache/skywalking-ui 3. 项目启动4.效果展示 1. 前期准备 注&#xff1a;本篇文章采用docker部署&#xff0c;采用8.2.0版本&#xff0c;版本一定…

机器学习、深度学习项目开发业务数据场景梳理汇总记录三

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

C语言 ——指针数组与数组指针

目录 一、二维数组 二、指针数组 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;书写方式 &#xff08;3&#xff09;指针数组模拟二维数组 三、数组指针 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;使用数组指针打印一维数组 &#xff08;3&a…

2023牛客暑期多校训练营7

Beautiful Sequence 贪心&#xff0c;二进制&#xff0c;构造 Cyperation 模拟 &#xff0c;数学 We Love Strings 分块&#xff0c;二进制枚举&#xff0c;二进制容斥dp Writing Books 签到 根据相邻两个异或值B&#xff0c;因为前小于等于后&#xff0c;故从高到低遍历B的每一…

AT89C51单片机实现单片机串口互动(中断方式,单片机--单片机,应答)

说一下功能&#xff1a;客户机发送0x01到服务机 2服务单片机应答0xf2到客户机 3客户机接收到0xf2,发送信息153432这6个数字到服务机 4client发送完信息后发送0xaa结束通信 5server接收到0xaa后回复0xaa结束通信&#xff0c;从此老死不相往来 看代码&#xff1a; //发送端…

C语言 ——函数指针变量

1、概念&#xff1a; 数组指针 - 是指针-是指向数组的指针&#xff0c;是存放数组地址的指针 函数指针 - 是指针 是指向函数的指针 - 是存放函数地址的指针!! 如上所示&#xff0c;函数也是具有地址的&#xff0c;而存放函数地址的指针变量成为函数指针变量。 而有如上所示&a…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区&#xff08;partition&#xff09;、多副本&#xff08;replica&#xff09;、基于 zookeeper 协调…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…

ThreadLLocal的学习

ThreadLocal的学习 ThreadLocal的学习1.ThreadLocal是什么&#xff1f;2.ThreadLocal的数据结构Java的四种引用类型 3.ThreadLocal为什么会出现内存泄露&#xff1f;既然会出现内存泄露为什么Entry的key还要使用弱引用&#xff1f;如何避免内存泄露&#xff1f; ThreadLocal的学…

最新版本2023UI千月影视APP源码 开源完美版前后端完美匹配 后端基于ThinkPHP框架

最新版本的2023UI千月影视APP源码是一款开源的完美版应用程序&#xff0c;具备前后端完美匹配的特点。该应用的后端开发基于ThinkPHP框架&#xff0c;这是一个广泛使用的PHP开发框架&#xff0c;具有稳定性和安全性方面的优势。 2023UI千月影视APP是一款提供电影、电视剧、综艺…

Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算

笔者在近一两年接触了Clickhouse数据库&#xff0c;在项目中也进行了一些实践&#xff0c;但一直都没有一些技术文章的沉淀&#xff0c;近期打算做个系列&#xff0c;通过一些具体的场景将Clickhouse的用法进行沉淀和分享&#xff0c;供大家参考。 首先我们假设一个Clickhouse数…

智能合约 -- 常规漏洞分析 + 实例

1.重入攻击 漏洞分析 攻击者利用合约漏洞&#xff0c;通过fallback()或者receive()函数进行函数递归进行持续取钱。 刚才试了一下可以递归10次&#xff0c;貌似就结束了(version: 0.8.20)。 直接看代码: 银行合约&#xff1a;有存钱、取钱、查看账户余额等函数。攻击合约:…

第04天 Spring是如何解决循环依赖的

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;每天一个知识点 ✨特色专栏&#xff1a…