nodejs学习计划--(二)fs文件系统和path模块

1. fs模块

fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操
作。

1. 文件写入

文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果
|方法|说明|
|-|-|
|writeFile|异步写入|
|writeFileSync|同步写入|
|appendFile/appendFileSync|追加写入|
|createWriteStream|流式写入|

1.1 writeFile异步写入
  • 语法:fs.writeFile(file, data[, options], callback)
  • 参数说明:
    • file: 文件名
    • data: 待写入的数据
    • option: 选项配置
      • encoding <string> | <null> 默认值:'utf8'
      • mode <integer> 默认值:0o666
      • flag <string> 默认值:'w'
        • 'a':打开文件进行追加。如果文件不存在,则创建该文件。
        • 'a+':打开文件进行读取和追加。如果文件不存在,则创建该文件。
        • 'r':打开文件进行读取。如果文件不存在,则会发生异常。
        • 'w':打开文件进行写入。创建(如果它不存在)或截断(如果它存在)该文件。
        • 'w+':打开文件进行读写。创建(如果它不存在)或截断(如果它存在)该文件。
      • flush <boolean> 如果所有数据都成功写入文件,并且 flushtrue,则使用 filehandle.sync() 来刷新数据。默认值:false
      • signal <AbortSignal> 允许中止正在进行的写入文件
    • callback: 写入回调
  • 返回值:undefined
  • 代码示例:
//  1. 导入fs模块
// require 是 Node.js 环境中的'全局'变量,用来导入模块
const fs = require('fs')// 2. 写入文件
// 文件不存在,会自动创建
fs.writeFile('./文件写入.txt', '三人行,必有我师焉', err => {// err写入失败:错误对象  写入成功: nullif(err){console.log('写入失败')return}console.log('写入成功')
})
1.2 writeFileSync同步写入
  • 语法:fs.writeFileSync(file, data[, options])

参数与fs.writeFile大体一致,只是没有callback参数

  • 返回值:undefined
  • 代码示例:
try{fs.writeFileSync('./座右铭.txt', '三人行,必有我师焉。');
}catch(e){console.log(e);
}

Node.js 中的磁盘操作是由其他 线程 完成的,结果的处理有两种模式:

  • 同步处理 JavaScript` 主线程 会等待 其他线程的执行结果,然后再继续执行主线程的代码,
    效率较低
  • 异步处理 JavaScript 主线程 不会等待 其他线程的执行结果,直接执行后续的主线程代码,
    效率较好
1.3 appendFile/appendFileSync追加写入
  • appendFile 作用是在文件尾部追加内容,appendFile 语法与 writeFile 语法完全相同
    语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
  • 返回值:undefined
  • 示例代码:
let fs = require('fs')// 异步追加
fs.appendFile('./文件写入.txt', '\r\nappend追加的内容', err => {if(err){console.log('appendFile追加失败')return}console.log('appendFile追加成功')
})// 同步追加
fs.appendFileSync('./文件写入.txt', '\r\nappendFileSync追加的内容')// writeFile追加内容
fs.writeFile('./文件写入.txt', '\r\nwriteFile追加的内容',{flag: 'a'}, err => {if(err){console.log('writeFile追加失败')return}console.log('writeFile追加成功')
})
fs.writeFileSync('./文件写入.txt', '\r\nwriteFileSync追加的内容',{flag: 'a'})
1.4 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.end()
// ws.close()

程序打开一个文件是需要消耗资源的 ,流式写入可以减少打开关闭文件的次数。
流式写入方式适用于 大文件写入或者频繁写入 的场景, writeFile 适合于 写入频率较低的场景

1.5 写入文件的场景
  • 文件写入 在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
    • 下载文件
    • 安装软件
    • 保存程序日志,如Git
    • 编辑器保存文件
    • 视频录制

需要持久化保存数据 的时候,应该想到 文件写入

2. 文件读取

文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:
|方法|说明|
|-|-|
|readFile|异步读取|
|readFileSync|同步读取|
|createReadStream|流式读取|

1.1 readFile异步读取
  • 语法:fs.readFile(path, [, options], callback)
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
    • callback: 回调函数
  • 返回值:undefined
  • 代码示例:
const fs = require('fs')// 异步读取
fs.readFile('./咏鹅.txt', err => {if(err){console.log('读取失败')}console.log('读取成功')
})
1.2 readFileSync同步读取
  • 语法:fs.readFileSync(path, [, options])
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
  • 返回值:string | Buffer
  • 代码示例:
// 同步读取
const ds = fs.readFileSync('./咏鹅.txt')
const dsf = fs.readFileSync('./咏鹅.txt', 'utf-8')
console.log(ds.toString(), '-----')
console.log(dsf.toString())
1.3 文件流式读取
  • 语法:fs.createReadStream(path, [, options])
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
  • 返回值:Object
  • 代码示例:
// 创建读取流读写
const rs = fs.createReadStream('../资料/笑看风云.mp4')// 每次取出64kb, 后执行回调一次
rs.on('data',  thunk => {console.log(thunk.length) // 65536 字节 => 64KB
})
// 读取完毕后,调取end回调(可选事件)
rs.on('end', ()=>{console.log('读取完毕')
})
1.4 读取文件应用场景

电脑开机
程序运行
编辑器打开文件
查看图片
播放视频
播放音乐
Git 查看日志
上传文件
查看聊天记录

3. 文件移动与重命名

Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件或文件夹
rename不会创建文件目录

  • 语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
  • 参数说明:
    • oldPath: 文件当前路径
    • newPath: 文件新的路径
    • callback: 操作后的回调
  • 代码示例:
// fs.rename('./咏鹅.txt', './咏鹅-骆宾王.txt', err => {
//   if(err){
//     console.log('重命名失败')
//   }
//   console.log('重命名成功')
// })fs.rename('./咏鹅.txt', './资料/咏鹅-骆宾王.txt', err => {if(err){console.log('移动失败')return }console.log('移动成功')
})

4. 文件删除

Node.js 中,我们可以使用 unlinkunlinkSync 来删除文件

  • 语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
  • 参数说明:
    • path: 文件操作路径
    • callback: 操作后的回调
  • 代码示例:
// fs.unlink('./文件写入.txt', err => {
//   if(err){
//     console.log('删除失败')
//     return
//   }
//   console.log('删除成功')
// })fs.rm('./文件写入.txt', err => {if(err){console.log('删除失败')return}console.log('删除成功')
})

5. 文件夹操作

借助 Node.js 的能力,我们可以对文件夹进行 创建读取删除 等操作
|方法|说明|
|-|-|
|mkdir/mkdirSync|创建文件夹|
|readdir/readdirSync|读取文件夹|
|rmdir/rmdirSyncrm/rmSync|删除文件夹|

1.1 mkdir创建文件夹

Node.js 中,我们可以使用 mkdirmkdirSync 来创建文件夹

  • 语法:
fs.mkdir(path, [, options], callback)
fs.mkdirSync(path, [, options])
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
      • recursive: 是否递归
    • callback: 回调函数
  • 代码示例:
// 创建目录
fs.mkdir('./html', err => {if(err){console.log('创建失败')return}console.log('创建成功')
})
// 递归创建
fs.mkdir('./a/b/c',{recursive: true}, err=>{if(err){console.log('创建失败')return}console.log('创建成功')
})
1.2 readdir读取文件夹

Node.js 中,我们可以使用 readdirreaddirSync 来读取文件夹

  • 语法:
fs.readdir(path, [, options], callback)
fs.readdir(path, [, options])
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
    • callback: 回调函数
  • 返回值:undefined
  • 代码示例:
const fs = require('fs')
// 读取目录
fs.readdir('./', (err, data)=>{if(err){console.log('读取失败')/     return}console.log('读取成功', data)
})
1.3 rmdir删除文件夹(使用.rm加配置项recursive

Node.js 中,我们可以使用 rmdirrmdirSync(rmrmSync) 来删除文件夹

  • 语法:
fs.rmdir(path, [, options], callback)
fs.rmdirSync(path, [, options])
  • 参数说明:
    • path: 文件路径
    • options: 选项配置
      • recursive: 是否递归
    • callback: 回调函数
  • 代码示例:
const fs = require('fs')
// 删除目录
// fs.rmdir('./html', err => {  
fs.rm('./html',{recursive: true}, err => {   if(err){console.log('删除失败')return}console.log('删除成功')
})
// 递归删除
// .rmdir 会提示被.rm替代
// fs.rmdir('./a',{recursive: true}, err => {   
fs.rm('./a',{recursive: true}, err => {   if(err){console.log('删除失败')return}console.log('删除成功')
})

6. 查看资源状态

Node.js 中,我们可以使用 statstatSync 来查看资源的详细信息

  • 语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
  • 参数说明:
    • path 文件夹路径
    • options 选项配置( 可选 )
    • callback 操作后的回调
  • 示例代码:
fs.stat('./文件写入.txt', (err, data) => {if(err){console.log(err)return}console.log(data)console.log(data.isFile())console.log(data.isDirectory())
})
  • 结果值对象结构:
    • size 文件体积
    • birthtime 创建时间
    • mtime 最后修改时间
    • isFile 检测是否为文件
    • isDirectory 检测是否为文件夹

7. 相对路径问题

fs 模块对资源进行操作时,路径的写法有两种:

  • 相对路径
    • ./座右铭.txt 当前目录下的座右铭.txt
    • 座右铭.txt 等效于上面的写法
    • ../座右铭.txt 当前目录的上一级目录中的座右铭.txt
  • 绝对路径
    • D:/Program Files windows 系统下的绝对路径
    • /usr/bin Linux 系统下的绝对路径

相对路径中所谓的 当前目录 ,指的是 命令行的工作目录 ,而并非是文件的所在目录
所以当命令行的工作目录与文件所在目录不一致时,会出现一些 BUG

8. __dirname

__dirnamerequire 类似,都是 Node.js 环境中的’全局’变量
__dirname 保存着 当前文件所在目录的绝对路径 ,可以使用 __dirname 与文件名拼接成绝对路径
代码示例:

console.log(__dirname)
fs.writeFileSync(__dirname + '/文件写入.txt', '三人行,必有我师焉')

使用 fs 模块的时候,尽量使用 __dirname 将路径转化为绝对路径,这样可以避免相对路径产生的Bug

9. 案例:文件批量重命名

/*
* 文件名 1 2 3 ... 改成 01 02 03 ...
*/
const fs = require('fs')const dir = fs.readdirSync('./')
dir.forEach(item => {const fileName = item.split('-')let [num, name] = fileNameif(Number(num) < 10){num = '0' + num}const newName = num + '-' + nameconsole.log(newName, 'sss')fs.renameSync(`./${item}`, `./${newName}`)
});

2. path模块

path 模块提供了 操作路径 的功能,我们将介绍如下几个较为常用的几个 API
|API|说明|
|-|-|
|path.resolve|拼接规范的绝对路径(常用)|
|path.sep|获取操作系统的路径分隔符|
|path.parse|解析路径并返回对象|
|path.basename|获取路径的基础名称|
|path.dirname|获取路径的目录|
|path.extname|获取路径的扩展名|
代码示例:

const fs =require('fs')
const path = require('path')// 写入文件
fs.writeFileSync(__dirname+'/index.txt', 'hello')console.log(__dirname+'/index.txt') // D:\Note\node-note\03_path模块/index.txt
// 1. resolve 解决
// 第一个参数一般是绝对路径,后续的参数是相对路径
console.log(path.resolve(__dirname, './index.txt')) //D:\Note\node-note\03_path模块\index.txt
// console.log(path.resolve(__dirname, './index.txt', 'A.HTML')) //D:\Note\node-note\03_path模块\index.txt\A.HTML
// console.log(path.resolve(__dirname, '/index.txt', 'A.HTML')) //D:\index.txt\A.HTML// 2. sep 系统的分隔符
console.log(path.sep) // Windows \ Linux /// 3. parse 解析路径返回对象
// __dirname 返回文件目录的决定路径
console.log(__dirname) //D:\Note\node-note\03_path模块
// __filename 返回文件的决定路径
console.log(__filename) //D:\Note\node-note\03_path模块\path.js
const str = 'D:\\Note\\node-note\\03_path模块\\path.js'
console.log(path.parse(str))
/*{root: 'D:\\',dir: 'D:\\Note\\node-note\\03_path模块',base: 'path.js',ext: '.js',name: 'path'
}*/console.log(path.basename(str)) // 获取基础文件名字
console.log(path.dirname(str)) // 获取目录名
console.log(path.extname(str)) // 获取扩展名

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

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

相关文章

Python学习之路-正则表达式

Python学习之路-正则表达式 简介 正则表达式是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里&#xff0c;正则表达式通常被用来检索、替换那些匹配某个模式的文本。 RE模块 在Python中需要通过正则表达式…

Flink TaskManager内存管理机制介绍与调优总结

内存模型 因为 TaskManager 是负责执行用户代码的角色&#xff0c;一般配置 TaskManager 内存的情况会比较多&#xff0c;所以本文当作重点讲解。根据实际需求为 TaskManager 配置内存将有助于减少 Flink 的资源占用&#xff0c;增强作业运行的稳定性。 TaskManager 内…

深度解析 Compose 的 Modifier 原理 -- Modifier.layout()、LayoutModifier

"Jetpack Compose - - Modifier 原理系列文章 " &#x1f4d1; 《 深度解析 Compose 的 Modifier 原理 - - Modifier、CombinedModifier 》 &#x1f4d1; 《 深度解析 Compose 的 Modifier 原理 - - Modifier.composed()、ComposedModifier 》 &#x1f4d1; 《 深度…

【Debian】非图形界面Debian10.0.0安装xfce和lxde桌面

一、安装 1. Debian10.0.0安装xfce桌面 sudo apt update sudo apt install xfce4 startxfce4 2. Debian10.0.0安装lxde桌面 sudo apt-get install lxde安装后重启电脑。 二、说明 XFCE、LXDE 和 GNOME 是三个流行的桌面环境&#xff0c;它们都是为类 Unix 操作系统设计…

目标检测--02(Two Stage目标检测算法1)

Two Stage目标检测算法 R-CNN R-CNN有哪些创新点&#xff1f; 使用CNN&#xff08;ConvNet&#xff09;对 region proposals 计算 feature vectors。从经验驱动特征&#xff08;SIFT、HOG&#xff09;到数据驱动特征&#xff08;CNN feature map&#xff09;&#xff0c;提高特…

MySQL - 使用 MySQL 存储过程来生成大量数据并插入到 MySQL 数据库中

可以使用 MySQL 存储过程来生成大量数据并插入到 MySQL 数据库中。下面是一个示例存储过程&#xff0c;它可以生成指定数量的模拟用户数据并将其插入到名为 users 的表中。 DELIMITER // CREATE PROCEDURE generate_fake_users(IN num_rows INT) BEGINDECLARE i INT DEFAULT 1…

Git一台电脑 配置多个账号

Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup &#xff0c;每个都有独立账号&#xff0c;经常需要在一个电脑上向多个代码仓提交后者更新代码&#xff0c;本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…

「sdkman」「nvm」Linux:基于sdkman安装多版本Java;安装maven;基于nvm安装多版本nodejs;安装yarn

1. 基于sdkman 安装多版本Java Linux环境下管理多版本java可以使用sdkman,官网: https://sdkman.io/ 需要注意sdkman 依赖 zip和unzip 命令,记得提前下载再下载sdkman 安装命令 按官网走很简单: curl -s “https://get.sdkman.io” | bash source “$HOME/.sdkman/bin/sdkm…

ARM64汇编01 - 环境搭建

arm官方手册 由于市面上几乎没有arm相关书籍&#xff0c;所以推荐看官方文档。虽然是英文的&#xff0c;看不下去也要硬看&#xff0c;毕竟搞这方面的还是得有啃英文文档/书籍的能力。 另外&#xff0c;再推荐一个翻译网站&#xff1a;https://www.deepl.com/zh/translator …

架设一台NFS服务器,并按照以下要求配置

1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台主机&#xff0c;…

LightDB - oracle_fdw 过滤条件下推增强【24.1】

LightDB - oracle_fdw 过滤条件下推增强【24.1】 1. 字符串比较下推1.1 示例 2. 隐式转换下推2.1 示例 3. nvl 和trim 下推3.1 示例 LightDB 在24.1版本对oracle_fdw 的where下推进行了增强&#xff0c;新增对如下两种情况进行下推&#xff1a; 字符串比较下推&#xff0c;如 …

1-RuoYi-Vue环境部署

1.准备工作 JDK > 1.8 (推荐1.8版本) Mysql > 5.7.0 (推荐5.7版本) Redis > 3.0 Maven > 3.0 Node > 12提示 前端安装完node后&#xff0c;最好设置下淘宝的镜像源&#xff0c;不建议使用cnpm&#xff08;可能会出现奇怪的问题&#xff09; 2.运行系统 前往…

Spring集成MyBatis与MyBatis-Plus添加分页插件

项目场景&#xff1a; MyBatis使用分页插件PageHelperMyBatis-Plus3.4.0版本之前添加分页插件&#xff0c;使用配置PaginationInterceptor&#xff1b;MyBatis-Plus3.4.0版本添加分页插件&#xff0c;使用配置MybatisPlusInterceptor&#xff1b; 配置示例&#xff1a; 1、My…

大模型微调学习记录-基于GLM-130B

0. 前序背景 论文&#xff1a;GLM-130B: AN OPEN BILINGUAL PRE-TRAINED MODEL GLM2的微调教程 目前GLM2-130B优于或相当GPT-3-175B的性能。 选择130B&#xff08;1300亿参数&#xff09;是从硬件性能考虑&#xff0c;可以在单张A100&#xff08;40Gx8&#xff09;上进行推理…

openssl3.2 - 官方demo学习 - mac - poly1305.c

文章目录 openssl3.2 - 官方demo学习 - mac - poly1305.c概述笔记END openssl3.2 - 官方demo学习 - mac - poly1305.c 概述 MAC算法为Poly1305, 加密算法为AES-128-ECB, 用key初始化加密算法 加密算法进行padding填充 对加密算法的key加密, 放入MAC_key后16字节, 将MAC_key的…

jvm -Djava.library.path 无法打开共享对象文件:

项目代码修改 java -jar -Xms1024m -Xmx1024m -Dloader.path/data/encrypt/lib -Djava.library.path/data/encrypt/libVtExtAPI.so server-1.0.0-SNAPSHOT.jar 重新启动

C#设计模式教程(1):简单工厂模式

在C#中,工厂模式可以分为三种主要类型:简单工厂模式、工厂方法模式和抽象工厂模式。 简单工厂模式(Simple Factory Pattern): 简单工厂模式并不属于23种经典设计模式之一,但它是工厂模式的一种简单形式。在简单工厂模式中,有一个工厂类负责根据传入的参数决定创建哪种产…

bevy the book 20140118翻译(全)

源自&#xff1a;Bevy Book: Introduction 主要用 有道 翻译。 Introduction 介绍 Getting Started 开始 Setup 设置 Apps 应用程序 ECS Plugins 插件 Resources 资源 Next Steps 下一个步骤 Contributing 贡献 Code 代码 Docs 文档 Building Bevys Ecosystem 构建 b…

VScode远程开发

VScode远程开发 在SSH远程连接一文中&#xff0c;我么介绍了如何使用ssh远程连接Jetson nano端&#xff0c;但是也存在诸多不便&#xff0c;比如:编辑文件内容时&#xff0c;需要使用vi编辑器&#xff0c;且在一个终端内&#xff0c;无法同时编辑多个文件。本节将介绍一较为实用…

基于ORB算法的图像匹配

基础理论 2006年Rosten和Drummond提出一种使用决策树学习方法加速的角点检测算法&#xff0c;即FAST算法&#xff0c;该算法认为若某点像素值与其周围某邻域内一定数量的点的像素值相差较大&#xff0c;则该像素可能是角点。 其计算步骤如下&#xff1a; 1&#xff09;基于F…