目录
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 中,我们可以使用 rename
或 renameSync
来移动或重命名 文件
或文件夹
语法:
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 中,我们可以使用rmdir
或 rmdirSync
来删除文件夹
语法:
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 中,我们可以使用 stat
或 statSync
来查看资源的详细信息
语法:
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
__dirname
与 requir
类似,都是 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
参考
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/144061.html