Nodejs 第二十章 fs下

Nodejs 第二十章 fs下

  • 接着上章节的内容,这章节继续加上写入、追加内容该怎么实现
    • 继实现了可读流,那可写流要怎么做?
    • 硬链接和软链接之前的区别又是什么?

API

  • 讲解下列API都采用同步的方式进行(但异步的方法本身也是拥有的)

writeFileSync写入内容

  1. 第一个参数写入的文件
  2. 第二个参数写入的内容
  3. 第三个是options可选项,包含了encoding编码 mode权限和flag
js 复制代码
const { writeFileSync } = require("node:fs")

writeFileSync('./xiaoyu01.txt', '我是小余')//内容不需要接收,直接运行
  • 上面第一种情况,"我是小余"这个内容会直接覆盖掉"./xiaoyu01.txt"下的所有内容。而我们要是只是想追加内容,而不希望原有的内容消失,那应该如何做?
    • 开启第三参数options配置项,里面可以选择flag的模式
    • 像我们想采用追加,就是'a',append(附加)的缩写
js 复制代码
const { writeFileSync } = require("node:fs")

writeFileSync('./xiaoyu01.txt', '我是小余',{
  flag:'a'//追加
})
  • 而这flag的配置项是可以有很多的,我以表格的形式总结在下面

flag配置项

标志 描述
a 打开文件进行追加。如果文件不存在,则创建该文件。
ax 类似于 a,但如果路径存在则操作失败。
a+ 打开文件进行读取和追加。如果文件不存在,则创建该文件。
ax+ 类似于 a+,但如果路径存在则操作失败。
as 以同步模式打开文件进行追加。如果文件不存在,则创建该文件。
as+ 以同步模式打开文件进行读取和追加。如果文件不存在,则创建该文件。
r 打开文件进行读取。如果文件不存在,则会发生异常。
r+ 打开文件进行读写。如果文件不存在,则会发生异常。
rs+ 以同步模式打开文件进行读写。这主要用于在 NFS 挂载上,可以跳过可能过时的本地缓存。
w 打开文件进行写入。创建(如果它不存在)或截断(如果它存在)该文件。
wx 类似于 w,但如果路径存在则操作失败。
w+ 打开文件进行读写。创建(如果它不存在)或截断(如果它存在)该文件。
wx+ 类似于 w+,但如果路径存在则操作失败。

appendFileSync 追加内容

  • 除了可以在flag中配置追加,还可以有专门的API进行追加内容,也就是appendFileSync,直译过来就是同步追加文件内容
    • 这个API的使用方式和writeFileSync是差不多的,可以让我们在不进行配置flag就实现追加效果
js 复制代码
const fs = require('node:fs')

fs.appendFileSync('index.txt', '\nunshift创始人\n麒麟哥')

可写流

fs.createWriteStream 方法用于创建一个可写流(Writable Stream),这是处理文件写入操作的一种高效方式,特别适用于大量数据的写入

创建可写流

  • 使用 fs.createWriteStream 方法可以创建一个指向特定文件的可写流。此方法接受一个文件路径作为参数,并可选择性地接受一个包含配置选项的对象,如编码、文件打开模式等。
js 复制代码
const fs = require('node:fs');
let writeStream = fs.createWriteStream('index.txt');

写入数据

  • 可写流提供了 .write() 方法来进行数据写入。此方法可以被多次调用,以流式传输大量数据到文件中。
js 复制代码
let verse = [
    '待到秋来九月八',
    '我花开后百花杀',
    '冲天香阵透长安',
    '满城尽带黄金甲'
];

verse.forEach(item => {
    writeStream.write(item + '\n');
});

结束写入

  • 当所有数据都已经发送到流中后,应调用 .end() 方法来关闭流。这个方法会发送一个信号,表示没有更多的数据被写入到 Writable Stream
js 复制代码
writeStream.end();

监听事件

  • 可写流对象是基于 EventEmitter 的,支持多种事件监听,其中 finish 事件在流完成写入所有数据并且关闭文件描述符之后触发
    • finish直译为完成的意思
js 复制代码
writeStream.on('finish', () => {
    console.log('写入完成');
});

错误处理

可写流还支持 error 事件,用来处理写入过程中可能出现的任何错误。

js 复制代码
writeStream.on('error', (error) => {
    console.error('写入失败:', error);
});

软链接与硬链接(pnpm底层原理)

硬链接(Hard Link)

硬链接指向文件系统中的一个文件数据块或索引节点(inode)。当我们创建一个硬链接时,实际上是在创建一个指向文件数据块的额外指针。

特点

  • 文件共享:硬链接允许多个文件名指向同一个文件,这样可以在不同的位置使用不同的文件名引用相同的内容。这样的共享文件可以节省存储空间,并且在多个位置对文件的修改会反映在所有引用文件上。
    • 硬链接确实允许多个文件名指向同一个文件的数据(即相同的 inode)。这意味着对任何一个硬链接文件的修改,都会反映在所有与之关联的硬链接文件上。这不是多个文件互不干扰 ,而是它们实际上是同一个文件的不同名字。所以,如果我们在一个硬链接上修改了内容,其他所有硬链接指向的文件内容也会改变,因为它们共享同一个数据块
  • 文件备份:通过创建硬链接,可以在不复制文件的情况下创建文件的备份。如果原始文件发生更改,备份文件也会自动更新。这样可以节省磁盘空间,并确保备份文件与原始文件保持同步。
    1. 硬链接可以用作一种节省空间的备份方法,因为它们不需要复制文件内容 ,只是增加了一个指向相同数据的新入口。当你更改文件内容时,所有硬链接看到的内容确实会更新,因为它们指向相同的数据
    2. 然而,如果你删除了原始文件名(即删除了其中一个硬链接),它并不会影响到该文件的其他硬链接 。硬链接只有在最后一个链接被删除后,文件数据才会从磁盘上删除。所以,与软链接不同,硬链接不会因为源文件的删除而变成悬空链接
  • 文件重命名:通过创建硬链接,可以为文件创建一个新的文件名,而无需复制或移动文件。这对于需要更改文件名但保持相同内容和属性的场景非常有用。

创建硬链接

js 复制代码
//创建 index.txt 的一个硬链接,名为 index2.txt。无论通过哪个文件名访问,文件内容都是相同的,因为它们共享同一个索引节点
fs.linkSync('./index.txt', './index2.txt'); // 在 Node.js 中创建硬链接

软链接(Symbolic Link,也称为符号链接或软连接)

软链接,与硬链接不同,是一个特殊类型的文件,它包含的是另一个文件的路径引用。

特点

  • 软链接可以创建指向文件或目录的引用。这使得你可以在不复制或移动文件的情况下引用它们,并在不同位置使用不同的文件名访问相同的内容。
  • 软链接可以用于创建快捷方式或别名,使得你可以通过一个简短或易记的路径来访问复杂或深层次的目录结构。
  • 软链接可以用于解决文件或目录的位置变化问题。如果目标文件或目录被移动或重命名,只需更新软链接的目标路径即可,而不需要修改引用该文件或目录的其他代码。

创建软链接

filefs.symlinkSync 方法中是一个参数,它指定了要创建的符号链接(软链接)的类型。这个参数非常重要,因为它告诉操作系统链接指向的是一个文件还是一个目录

  1. 'file' :这告诉 fs.symlinkSync 方法目标是一个普通文件。在大多数操作系统中,默认情况下,符号链接都是文件链接,因此这个参数通常是用于明确表示链接指向一个文件。
  2. 'dir' :如果链接的目标是一个目录,则应该使用 'dir'。这对于在 Unix-like 系统上正确解析链接非常重要,因为它会影响文件路径的处理。
  3. 'junction' :这是 Windows 系统特有的,用于创建一个指向目录的特殊类型的链接,比普通的 'dir' 类型的符号链接具有更多的权限和功能。
js 复制代码
//会创建 `index.txt` 的一个软链接,名为 `index3.txt`。如果通过软链接访问,实际上是访问了原始文件。但如果原始文件被删除,软链接就会失效。
fs.symlinkSync('./index.txt', './index3.txt', 'file'); // 在 Node.js 中创建软链接

//软链接需要管理员权限

使用场景和选择

  • 硬链接:适用于需要确保即使文件被删除,内容仍然保留的场景。它们经常被用于备份和恢复系统中。
  • 软链接:适用于需要创建跨文件系统链接或链接到目录的场景。它们在动态链接库、应用程序快捷方式创建等场景中非常有用。
相关推荐
一颗松鼠3 分钟前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds23 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
阿伟来咯~1 小时前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端1 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱1 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai1 小时前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨2 小时前
在JS中, 0 == [0] 吗
开发语言·javascript
bysking2 小时前
【前端-组件】定义行分组的表格表单实现-bysking
前端·react.js
王哲晓3 小时前
第三十章 章节练习商品列表组件封装
前端·javascript·vue.js
fg_4113 小时前
无网络安装ionic和运行
前端·npm