03-Node.js—fs模块

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新手到高手

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东方青云、

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值