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(回调函数)写入失败: 错误对象  写入成功: null
      if(err){
        console.log('写入失败');
        return;
      }
      console.log('写入成功');
    });
    

    在这里插入图片描述


  • 异步:如下,1+1在最后,但它压根不带等上边的,它俩一块运行,谁也不妨碍谁,1+1先跑完就先输出。

    /**
     * 需求:
     * 新建一个文件, 座右铭.txt, 写入内容, 三人行, 则必有我师焉
     */
    
    //1. 导入 fs 模块
    const fs = require('fs');
    
    //2. 写入文件
    fs.writeFile('./座右铭.txt', '三人行, 则必有我师焉', err => 
    {
      // err(回调函数)写入失败: 错误对象  写入成功: null
      if(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与文件名拼接成绝对路径
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode150道面试经典题--验证回文串(简单)

1.题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

TCP协议的报头格式和滑动窗口

文章目录 TCP报头格式端口号序号和确认序号确认应答&#xff08;ACK&#xff09;机制超时重传机制 首部长度窗口大小报文类型URGACKSYNPSHFINRST 滑动窗口滑动窗口的大小怎么设定怎么变化滑动窗口变化问题 TCP报头格式 端口号 两个端口号比较好理解&#xff0c;通过端口号来找…

el-tree-select那些事

下拉菜单树形选择器 用于记录工作及日常学习涉及到的一些需求和问题 vue3 el-tree-select那些事 1、获取el-tree-select选中的任意层级的节点对象 1、获取el-tree-select选中的任意层级的节点对象 1-1数据集 1-2画面 1-3代码 1-3-1画面代码 <el-tree-selectv-model"s…

ELK常见部署架构以及出现的问题及解决方案

ELK常见部署架构以及出现的问题及解决方案 ELK 已经成为目前最流行的集中式日志解决方案&#xff0c;它主要是由Beats 、Logstash 、Elasticsearch 、 Kibana 等组件组成&#xff0c;来共同完成实时日志的收集&#xff0c;存储&#xff0c;展示等一站式的解决方案。本文将会介…

Stable Diffusion - 哥特 (Goth) 风格服装与背景的 LoRA 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132177882 图像来源于 Goth Clothing 的 LoRA 效果&#xff0c;配合哥特 (Goth) 风格服饰的相关提示词。 测试模型&#xff1a;DreamShaper 8 哥…

STM32CubeMX之freeRTOS互斥量

这是大哥保护小弟的故事 高中低等级的任务 互斥量就是谁要敢插我小弟的队&#xff0c;我就要打他&#xff0c;不能让其他人插我小弟的队 互斥量的使用是默认开启的不用手动开启&#xff01; 最高优先级任务&#xff1a;延时&#xff08;10ms&#xff09;再上厕所 中间&#x…

【网络编程·传输层】UDP和TCP的经典八股文

目录 一、端口号划分 二、部分指令 1、pidof&#xff08;用于查看进程id&#xff09; 2、netstat&#xff08;查看网络状态&#xff09; 三、UDP协议 1、UDP协议格式 2、UDP协议如何进行封装、解包、分用 2.1封装、解包 2.2分用 3、UDP协议的特点 3.1UDP协议的特点 …

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

hive修改表或者删除表时卡死问题的解决(2023-08-08)

背景&#xff1a;前阶段在做hive表的改表名时&#xff0c;总是超时&#xff0c;表是内部表&#xff0c;数据量特别大&#xff0c;无论你是修改表名还是删除表都是卡死的状态&#xff0c;怎么破&#xff1f; 终于&#xff1a;尝试出来一个新的方法 将内部表转化成外部表&#…

24.Netty源码之合理管理堆内存

highlight: arduino-light 合理管理 Netty 堆外内存 内存使用目标 •内存占用少(空间) •应用速度快(时间) 即多快好省 对 Java 而言&#xff1a;减少 Full GC 的 STW(Stop the world)时间 内存使用技巧 • 减少对象本身大小 md 例 1&#xff1a;用基本类型就不要用包装类。 例…

嵌入式虚拟仿真实验教学平台之串口发送数据

嵌入式虚拟仿真实验教学平台课程系列 串口发送数据实验 课程内容 本实验使用 STM32 的串口发送数据。开始仿真后,打开串口监视器&#xff0c;串口监视器会打印出要发送的数据。 课程目标 学习配置使用GPIO功能学习配置使用复用功能学习配置使用UART功能 硬件设计 本课程…

css小练习:案例6.炫彩加载

一.效果浏览图 二.实现思路 html部分 HTML 写了一个加载动画效果&#xff0c;使用了一个包含多个 <span> 元素的 <div> 元素&#xff0c;并为每个 <span> 元素设置了一个自定义属性 --i。 这段代码创建了一个简单的动态加载动画&#xff0c;由20个垂直排列的…

allegro中不可选时,如何对find进行可选操作

allegro出现不可选时&#xff0c;只能尝试其他单一的操作&#xff0c;但这样效率不高&#xff1b;可以通过菜单栏Display下拉菜单点击Element&#xff0c;即可实现FIND下选择需要调整的选项。

selenium爬虫与配置谷歌浏览器的driver问题

用selenium爬虫时&#xff0c;明明已经安装了selenium模块&#xff0c;程序却运行不了。在使用selenium之前必须先配置浏览器对应版本的webdriver 本文主要涉及驱动有问题driver 网上有很多手动的方法&#xff08;查看谷歌浏览的版本然后在其他博主分享的webdriver中下载与自己…

CosmosAI欧盟数字超算新时代战略合作签约仪式在伦敦举行

据英国权威媒体获悉&#xff0c;由分布式超算网络服务商CosmosAI主办的欧盟数字超算新时代战略合作签约仪式将于8月14日英国伦敦历史悠久的莱福士OWO酒店隆重举办&#xff0c;该酒店曾作为爱德华七世国王加冕仪式以及丘吉尔二战办公室享誉盛名。 本次活动CosmosAI基金会联合创…

HA3 SQL样本实验:一种混合计算查询的全新样本解决方案

作者&#xff1a;陆唯一(芜霜) HA3&#xff08;对外开源代号&#xff1a;Havenask &#xff09;是阿里智能引擎团队自研的大规模分布式检索系统&#xff0c;广泛应用于阿里内部的搜索业务&#xff0c;是十多年来阿里在电商领域积累下来的核心竞争力产品。Ha3 SQL 是在原有Ha3引…

GitOps 与 DevOps:了解关键差异,为企业做出最佳选择

在软件开发领域&#xff0c;GitOps 和 DevOps 是加强协作和实现软件交付流程自动化的重要技术。虽然这两种模式都旨在提高软件开发生命周期的效率&#xff0c;但它们的核心原则和实施方式却各不相同。 本篇文章将帮助您了解 GitOps 和 DevOps 之间的差异、它们的工作流程&am…

python——案例17:判断某年是否是闰年

案例17&#xff1a;判断某年是否是闰年 判断依据&#xff1a;闰年就是能被400整除&#xff0c;或者能被4整除的年份numint(input(输入年份&#xff1a;))if num%1000: if num%4000: #整百年份的判断print("%s年是闰年"%num) #…

湘大 XTU OJ 1291 Buying Gifts 题解(非常详细):枚举 维护最小值 排序

一、链接 1291 Buying Gifts 二、题目 题目描述 快到年末了&#xff0c;Boss Liu准备在年会上发些礼物&#xff0c;由于不想礼物的价格区别太大&#xff0c;Boss Liu希望最好的礼物与最差的礼物价格相差越小越好。 当然&#xff0c;如果存在相同的选择&#xff0c;Boss Liu…