Node.js—fs模块

news2025/3/13 0:23:48

目录

  • 1、什么是fs
  • 2、同步和异步调用
  • 3、文件写入
    • 3.1 writeFile 异步写入
    • 3.2 writeFileSync 同步写入
    • 3.3 appendFile / appendFileSync 追加写入
    • 3.4 createWriteStream 流式写入
    • 3.5 写入文件的场景
  • 4、文件读取
    • 4.1 readFile 异步读取
    • 4.2 readFileSync 同步读取
    • 4.3 createReadStream 流式读取
    • 4.4 读取文件应用场景
  • 5、文件的复制
  • 6、文件移动与重命名
  • 7、文件删除
  • 8、文件夹操作
    • 8.1 mkdir 创建文件夹
    • 8.2 readdir 读取文件夹
    • 8.3 rmdir 删除文件夹
  • 9、查看资源状态
  • 10、相对路径问题
  • 11、__dirname
  • 参考

1、什么是fs

  • fs 全称为 file system ,称之为 文件系统 ,是 Node.js 中的 内置模块 ,可以对计算机中的磁盘进行操 作。
  • 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给 远程的客户端。
  • Node通过fs模块来和文件系统进行交互
  • 该模块提供了一些标准文件访问API来打开、 读取、写入文件,以及与其交互。

2、同步和异步调用

  • fs模块中所有的操作都有两种形式可供选择 同步异步
  • 同步文件系统会阻塞程序的执行,也就是 除非操作完毕,否则不会向下执行代码。
  • 异步文件系统不会阻塞程序的执行,而是 在操作完成时,通过回调函数将结果返回。

3、文件写入

  • 文件写入就是将 数据 保存到 文件 中,我们可以使用如下几个方法来实现该效果。
    在这里插入图片描述

3.1 writeFile 异步写入

语法: fs.writeFile(file, data[, options], callback)
参数说明:

  • file 文件名
  • data 待写入的数据
  • options 选项设置 (可选)
  • callback 写入回调

返回值: undefined

代码示例:

// require 是 Node.js 环境中的'全局'变量,用来导入模块
const fs = require('fs')
//将 『君不见黄河之水天上来,奔流到海不复回。君不见高堂明镜悲白发,朝如青丝暮成雪。』 
//写入到当前文件夹下的『将进酒.txt』文件中
fs.writeFile('./将进酒.txt','君不见黄河之水天上来,奔流到海不复回。\r\n君不见高堂明镜悲白发,朝如青丝暮成雪。',err=>{
    //如果写入失败,则回调函数调用时,会传入错误对象,如写入成功,会传入 null
    if(err) throw err
    console.log('写入成功');
})

3.2 writeFileSync 同步写入

语法: fs.writeFileSync(file, data[, options])
参数与 fs.writeFile 大体一致,只是没有 callback 参数
返回值: undefined
代码示例:

const fs = require('fs')
fs.writeFileSync('./将进酒.txt','君不见黄河之水天上来,奔流到海不复回。\r\n君不见高堂明镜悲白发,朝如青丝暮成雪。')

由于同步写入没有回调函数,无法进行异常处理,所以我们需要通过try catch 来进行捕获错误。

代码示例:

const fs = require('fs')
try {
    fs.writeFileSync('./将进酒.txt', '君不见黄河之水天上来,奔流到海不复回。\r\n君不见高堂明镜悲白发,朝如青丝暮成雪。')
} catch (e) {
    console.log(e);
}

3.3 appendFile / appendFileSync 追加写入

appendFile 作用是在文件尾部追加内容,appendFile 语法与writeFile语法完全相同
语法:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])

返回值: 二者都为 undefined
实例代码:

const fs = require('fs')
//异步追加写入
fs.appendFile('./将进酒.txt', '\r\n人生得意须尽欢,莫使金樽空对月。',err=> {
    if(err) throw err
    console.log('追加成功');
})
//同步追加写入
fs.appendFileSync('./将进酒.txt', '\r\n人生得意须尽欢,莫使金樽空对月。')

使用writeFile也可以实现追加写入,不过要加上options 选项设置,第三个参数写上{flag:'a'}
代码示例:

const fs = require('fs')
fs.writeFile('./将进酒.txt', '\r\n人生得意须尽欢,莫使金樽空对月。',{flag:'a'},err => {
    if(err) throw err
    console.log('追加成功');
})

3.4 createWriteStream 流式写入

语法: fs.createWriteStream(path[, options])
参数说明:
path 文件路径
options 选项配置( 可选 )
返回值: Object
代码示例:

// 导入fs
const fs = require('fs')
//创建写入流对象
const ws = fs.createWriteStream('./将进酒·君不见.txt');
// write写入
ws.write('君不见,黄河之水天上来,奔流到海不复回\r\n')
ws.write('君不见,高堂明镜悲白发,朝如青丝暮成雪\r\n')
// 关闭通道
ws.close() */

不加上options 选项配置,则后面追加的内容会覆盖原有内容。
我们将第二个参数写上{flag:'a'},即可实现追加操作。

const fs = require('fs')
const ws = fs.createWriteStream('./将进酒.txt',{flags:'a'})
ws.write('君不见,黄河之水天上来,奔流到海不复回\r\n')
ws.write('君不见,高堂明镜悲白发,朝如青丝暮成雪\r\n')
ws.close()

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

3.5 写入文件的场景

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

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

4、文件读取

文件读取顾名思义,就是通过程序从文件中取出其中的数据,我们可以使用如下几种方式:

在这里插入图片描述

4.1 readFile 异步读取

语法: fs.readFile(path,[options], callback)
参数说明:
path 文件路径
options 选项配置(可选)
callback 回调函数
返回值: undefined

代码示例:

const fs = require('fs')
fs.readFile('./将进酒.txt',(err,data)=> {
    if(err) {
        console.log('写入失败');
        return
    }
    console.log(data);
})
//<Buffer e5 90 9b e4 b8 8d e8 a7 81 ef bc 8c e9 bb 84 e6 b2 b3 e4 b9 8b e6 b0 b4 e5 a4 a9 e4 b8 8a e6 9d a5 ef bc 8c e5 a5 94 e6 b5 81 e5 88 b0 e6 b5 b7 e4 b8 ... 1256 more bytes>

在不加上options 选项配置的时候,默认输出的是一个16进制的数据。
加上可选参数:'utf-8',输出为字符串,不过也可以通过toString()的方法进行转化。

const fs = require('fs')
fs.readFile('./将进酒.txt','utf-8',(err,data)=> {
    if(err) {
        console.log('写入失败');
        return
    }
    console.log(data);
})
//君不见,黄河之水天上来,奔流到海不复回

4.2 readFileSync 同步读取

语法: fs.readFileSync(path[, options])
参数说明:
path 文件路径
options 选项配置
返回值: string | Buffer
代码示例:

const fs = require('fs')
const data = fs.readFileSync('./将进酒.txt')
console.log(data);
//<Buffer e5 90 9b e4 b8 8d e8 a7 81 ef bc 8c e9 bb 84 e6 b2 b3 e4 b9 8b e6 b0 b4 e5 a4 a9 e4 b8 8a e6 9d a5 ef bc 8c e5 a5 94 e6 b5 81 e5 88 b0 e6 b5 b7 e4 b8 ... 1256 more bytes>
const data1 = fs.readFileSync('./将进酒.txt','utf-8')
console.log(data1);
//君不见,黄河之水天上来,奔流到海不复回

4.3 createReadStream 流式读取

语法: fs.createReadStream(path[, options])
参数说明:
path 文件路径
options 选项配置( 可选 )
返回值: Object
代码示例:

const fs = require('fs')
//创建读取流对象
const re = fs.createReadStream('./将进酒.txt')
//每次取出 64k 数据后执行一次 chunk 回调
re.on('data', chunk => {
    console.log(chunk);
    console.log(chunk.length);
})
//读取完毕后, 执行 end 回调
re.on('end', () => {
    console.log('读取完成');
})
//<Buffer e5 90 9b e4 b8 8d e8 a7 81 ef bc 8c e9 bb 84 e6 b2 b3 e4 b9 8b e6 b0 b4 e5 a4 a9 e4 b8 8a e6 9d a5 ef bc 8c e5 a5 94 e6 b5 81 e5 88 b0 e6 b5 b7 e4 b8 ... 1256 more bytes>
1306

加上options 选项配置'utf-8'默认输出为字符串

const fs = require('fs')
//创建读取流对象
const re = fs.createReadStream('./将进酒.txt','utf-8')
//每次取出 64k 数据后执行一次 chunk 回调
re.on('data', chunk => {
    console.log(chunk);
    console.log(chunk.length);
})
//读取完毕后, 执行 end 回调
re.on('end', () => {
    console.log('读取完成');
})

4.4 读取文件应用场景

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

5、文件的复制

思路:
1、读取你要复制的文件
2、将读取到的文件写入到一个新的文件当中
代码示例:

// 方法一
 const fs = require('fs')
 //读取文件
const data = fs.readFileSync('./将进酒.txt')
//写入文件
fs.writeFileSync('./将进酒2.txt',data) 
//方式二
const fs = require('fs')
//创建读取流文件
const data1 = fs.createReadStream('./将进酒.txt')
//创建写入流文件
const ws = fs.createWriteStream('./将进酒5.txt')
data1.on('data',chunk=>{
    ws.write(chunk)
})
data1.on('end',()=> {
    console.log('复制成功');
})

6、文件移动与重命名

在 Node.js 中,我们可以使用 renamerenameSync 来移动或重命名 文件文件夹
语法:
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
参数说明:
oldPath 文件当前的路径
newPath 文件新的路径
callback 操作后的回调
代码示例:

const fs = require('fs')
//异步
fs.rename('./将进酒.txt','../将进酒1.txt',err=> {
    if(err) {
        console.log('移动失败');
        return
    }
    console.log('移动成功');
})
//同步
fs.renameSync('./将进酒2.txt','../将进酒3.txt')

7、文件删除

在 Node.js 中,我们可以使用 unlink、或 unlinkSync'rm' 'rmSync' 来删除文件
语法:
fs.unlink(path, callback)
fs.unlinkSync(path)
参数说明:
path 文件路径
callback 操作后的回调
代码示例:

const fs =require('fs')
fs.unlink('./将进酒.txt',err=> {
     if(err) {
        console.log('删除失败');
        return
    }
    console.log('删除成功');
})
fs.unlinkSync('./将进酒.txt')

语法:
fs.rm(path, callback)
fs.rmSync(path)
参数说明:
path 文件路径
callback 操作后的回调
代码示例:

const fs =  require('fs')
fs.rm('./将进酒.txt',err=>{
    if(err) {
        console.log('删除失败');
        return
    }
    console.log('删除成功');
})
fs.rmSync('./将进酒.txt')

8、文件夹操作

  • 借助 Node.js 的能力,我们可以对文件夹进行 创建 、 读取 、 删除 等操作
    在这里插入图片描述

8.1 mkdir 创建文件夹

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

const fs = require('fs')
//异步创建
fs.mkdir('./白球',err=>{
     if(err) {
        console.log('创建失败');
        return
    }
    console.log('创建成功');
})
//同步创建
fs.mkdirSync('./白球1')

递归创建法

const fs = require('fs')
//异步创建
fs.mkdir('./白白球/小黑球/小蓝球',{recursive:true},err=>{
     if(err) {
        console.log('创建失败');
        return
    }
    console.log('创建成功');
})
//异步创建
fs.mkdirSync('./白白球/小黑球/小蓝球',{recursive:true})

8.2 readdir 读取文件夹

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

const fs = require('fs')
//异步读取
fs.readdir('./', (err, data) => {
    if (err) {
        console.log('读取失败');
        return
    }
    console.log(data);
})
//同步读取
const data = fs.readdirSync('./')
console.log(data);

8.3 rmdir 删除文件夹

在 Node.js 中,我们可以使用rmdirrmdirSync 来删除文件夹
语法:
fs.rmdir(path[, options], callback)
fs.rmdirSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置( 可选 )
callback 操作后的回调

示例代码:

const fs = require('fs')
// 异步删除
fs.rmdir('./白球',err=>{
     if (err) {
        console.log('删除文件夹失败');
        return
    }
    console.log('删除文件夹成功');
})
// 同步删除
fs.rmdirSync('./白球1')

递归删除法,和创建一样,加上{recursive:true})

const fs = require('fs')
// 异步删除
fs.rmdir('./白白球',{recursive:true},err=> {
     if (err) {
        console.log('删除文件夹失败');
        return
    }
    console.log('删除文件夹成功');
})
// 同步删除
fs.rmdir('./白白球',{recursive:true})

系统会提醒我们
[DEP0147] DeprecationWarning:在Node.js的未来版本中,Rmdir (path, {recursive: true})将被删除。使用fs。Rm (path, {recursive: true})
不影响结果

我们换成rm进行删除就没事了

const fs = require('fs')
// 异步删除
fs.rm('./白白球',{recursive:true},err=> {
     if (err) {
        console.log('删除文件夹失败');
        return
    }
    console.log('删除文件夹成功');
})
// 同步删除
fs.rm('./白白球',{recursive:true})

9、查看资源状态

在 Node.js 中,我们可以使用 statstatSync 来查看资源的详细信息
语法:
fs.stat(path[, options], callback)
fs.statSync(path[, options])
参数说明:
path 文件夹路径
options 选项配置( 可选 )
callback 操作后的回调
示例代码:

const fs = require('fs')
//异步
fs.stat('./10-fs查看资源状态.js', (err, data) => {
    if (err) {
        console.log('查看失败');
        return
    }
    console.log(data);
})
//同步
const data = fs.statSync('./10-fs查看资源状态.js')
console.log(data);

结果值对象结构:
size 文件体积
birthtime 创建时间
mtime 最后修改时间
isFile 检测是否为文件
isDirectory 检测是否为文件夹

10、相对路径问题

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

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

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

11、__dirname

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

const fs = require('fs')
fs.writeFile(__dirname + './将进酒.txt', '\r\n人生得意须尽欢,莫使金樽空对月。', { flag: 'a' }, err => {
    if (err) throw err
    console.log('追加成功');
})

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

参考

尚硅谷2023版Node.js零基础视频教程,nodejs新手到高手

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

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

相关文章

C++基础知识总结(详解)

前言 文章篇幅较大&#xff0c;内容充实 请在阅读的过程中保持一个批判的态度 C基础 C头文件 C有自己的头文件&#xff0c;例如iostream 没有.h 也可以用C的头文件 例如stdio.h 有.h 或者将C文件C化 例如cstdio 前面加c没有.h 名字空间 划分逻辑单元。避免名字冲突 创建…

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块&#xff0c;用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战&#xff0c;但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

【短篇】函数重载

函数重载 重载使用规则 重载 函数重载也是CPP相较于C的一个优化内容。 在C中我们都知道函数名不能重名 当然这个错误对于我还有类似我这种只学过C的人来说&#xff0c;这个错误是显得多么理所当然。 但是在Cpp中&#xff0c;则对这个功能进行了优化 看到这就有人问了&#x…

我去蔚来试驾了

前面写了比亚迪汉、小鹏P7i的试驾体验&#xff0c;链接如下&#xff1a; 小鹏P7I试驾体验&#xff01; 今天接着分享蔚来ET5的试驾体验&#xff0c;实话实说&#xff0c;我是蔚来ET5的颜粉&#xff0c;颜值也是ET5最大的卖点之一。 我身边不少朋友&#xff0c;不管是男生还是女…

windows下使用vite搭建vue开发环境

windows下使用vite搭建vue开发环境 1 下载安装配置NodeJS1.1 下载1.2 安装1.3 配置1.4 npm镜像加速配置1.6 设置环境变量 2 Vite安装 1 下载安装配置NodeJS 1.1 下载 下载地址&#xff1a;https://nodejs.cn/download 到NodeJS官网&#xff0c;选择Windows安装包即可。 1.2…

网络协议-UDP vs TCP, HTTP2.0和3.0

目录 TCP vs UDP Internet协议群&#xff08;TCP/IP协议群&#xff09; 传输层和网络层 User Data Diagram&#xff08;UDP&#xff09; 连接 重发&#xff08;校验&#xff09; UDP不保证顺序 思考&#xff1a;看了上面的几点&#xff0c;UDP没有虚拟连接、不校验数据、…

Vue ElementUI Axios 前后端案例(day01) 之Vue

前言js 问js是什么&#xff0c;他有什么作用&#xff0c;与html和css的区别是什么 JavaScript&#xff08;简称JS&#xff09;是一种脚本语言&#xff0c;用于在网页上实现交互效果、动态效果和动态数据更新等功能。它是一种解释性语言&#xff0c;需要在浏览器中解释和执行。…

【Paper Note】Swin Transformer: Hierarchical ViT using Shifted Windows

Swin Transformer: Hierarchical ViT using Shifted Windows 概述核心思想整体结构名词解释与vit区别 模型处理过程概括Patch EmbeddingBasicLayerPatch MergingSwin Transform BlockWindow AttentionShifted Window Attention小结 模型使用及代码模型使用环境配置SwinT 代码Pa…

跨境卖家都要知道的:对话式销售

买家可以用他们的指纹登录大多数东西&#xff0c;并通过与它交谈来管理他们的日历。这些人不会填写一份表格&#xff0c;如果他们填写的字段越多&#xff0c;表格的长度就会越长。如果他们知道只会受到骚扰&#xff0c;他们当然不会下载某些东西。 相反&#xff0c;他们更喜欢…

[Linux系统]系统安全及应用一

系统安全及应用一、账号安全基本措施1.1系统账号清理1.1.1将非登录用户的shell设为/sbin/nologin1.1.2锁定长期不使用的账号1.1.3删除无用的账号1.1.4锁定账号文件文件chattr1.1.5查看文件校验和md5sum1.2密码安全控制1.2.1设置密码有效期1.3历史命令限制1.3.1 减少记录命令的条…

5GHz无线局域网系统模拟

移动电视双天线分集接收技术 随着DVB-T在手机电视、车载电视、楼宇电视、地铁电视等户外广播领域内的发展&#xff0c;在这些接收范围内&#xff0c;多径衰落、多普勒频移等小范围衰落是不可避免的问题&#xff0c;解决这些衰落和干扰成为倍受关注的问题。为了解决衰落&#x…

rk3568 点亮LCD (BT656 BT1120)

rk3568 适配 BT656/BT1120 BT.656 TX 和 BT.1120 TX&#xff0c;是一种并行输出接口&#xff0c;而 Camera 对应的是 BT.656 RX和 BT.1120 RX&#xff0c;是一种并行输入接口&#xff0c;两则在协议上是一致的。与同为并口的RGB非常像&#xff0c;在rk3568 芯片上RGB和BT656/B…

【jenkins】Jenkins连接 Gitlab实现 push代码自动构建

目录 一、安装插件 二、构建任务 三、为任务配置触发器 四、到gitlab进行设置webhooks 4.1 设置网络 4.2 到jenkins对应项目的源码库 4.3 测试 4.3.1 点击测试--标签推送事件 4.3.2 点击编辑 一、安装插件 持续部署的第一步需要检查是否安装gitlab插件&#xff1a; gitla…

Doris(9):删除数据(Delete)

Delete不同于其他导入方式&#xff0c;它是一个同步过程。和Insert into相似&#xff0c;所有的Delete操作在Doris中是一个独立的导入作业&#xff0c;一般Delete语句需要指定表和分区以及删除的条件来筛选要删除的数据。 Doris 目前可以通过两种方式删除数据&#xff1a; DE…

记录-JavaScript常规加密技术

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 当今Web开发中&#xff0c;数据安全是一个至关重要的问题&#xff0c;为了确保数据的安全性&#xff0c;我们需要使用加密技术。JavaScript作为一种客户端编程语言&#xff0c;可以很好地为数据进行加…

Spring Boot 安全

目录 1.概述 2.token 2.1.理论 2.2.使用 3.JWT 3.1.理论 3.2.使用 4.oauth 5.Spring Security 5.1.概述 5.2.基本认证授权 5.3.加密 1.概述 在后端来说&#xff0c;安全主要就是控制用户访问&#xff0c;让对应权限的用户能访问到对应的资源&#xff0c;主要是两点…

AOP通知中获取数据

AOP通知中获取数据 之前我们写AOP仅仅是在原始方法前后追加一些操作&#xff0c;接下来我们要说说AOP中数据相关的内容&#xff0c;我们将从获取参数、获取返回值和获取异常三个方面来研究切入点的相关信息。 获取切入点方法的参数&#xff1a;所有的通知类型都可以获取参数 …

Vulhub开源漏洞靶场用Java远程访问

事件起因&#xff0c;被迫参加某竞赛&#xff0c;中途发现&#xff0c;全员摸鱼&#xff0c;遂一起摸鱼Vulhub是一个面向大众的开源漏洞靶场&#xff0c;无需docker知识&#xff0c;简单执行一条命令即可编译、运行一个完整的漏洞靶场镜像。 Installation 在Ubuntu 20.04下安…

JVM 垃圾回收详解之内存分配和回收原则+死亡对象判断方法

前言 当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时&#xff0c;我们就需要对这些“自动化”的技术实施必要的监控和调节。 堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核…

【STM32】基础知识 第七课 存储器映射 寄存器映射

【STM32】基础知识 第七课 存储器映射 & 寄存器映射 STM32 寻址范围存储器映射存储器功能划分 (F1 为例)Block 0Block 1Block 2寄存器映射 寄存器映射 (F1 为例)寄存器映射举例寄存器地址计算GPIO 外设基地址及偏移量寄存器地址及偏移量寄存器地址计算过程 使用结构体映射寄…