fs模块和path模块
fs = file system 文件系统
fs模块可以实现与硬盘的交互,例如文件的创建、删除、重命名、移动,还有文件的写入,读取,以及文件夹的相关操作。
# 写入文件
# writeFile异步写入
语法: fs.writeFile(file, data[, options], callback)
参数说明:
- file 文件名
- data 待写入的数据
- options 选项设置(可选)
- callback 写入回调
返回值: undefined
/**
* 需求:
* 新建一个文件,座右铭.txt,写入内容,三人行,则必有我师焉
*/
// 1. 导入fs模块
const fs = require('fs');
// 2. 写入文件
fs.writeFile('./座右铭.txt', '三人行,则必有我师焉', err => {
// err 写入失败:错误对象 写入成功:null
if(err) {
console.log('写入失败')
return
}
console.log('写入成功 ')
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 同步写入
// 同步写入
fs.writeFileSync('./data.txt','test')
2
# 文件追加写入
appendFile / appendFileSync追加写入
appendFile作用是在文件尾部追加内容,appendFile语法与writeFile语法完全相同:
fs.appendFile(file, data[, options], callback)
fs.appendFileSync(file, data[, options])
返回值:二者都为 undefined
const fs = require('fs')
fs.appendFile('./座右铭.txt', ',则其善者而从之,其不善者而改之', err => {
if(err) {
console.log('追加失败')
return
}
console.log('追加成功')
})
2
3
4
5
6
7
8
9
# createWriteStream流式写入
语法:fs.createWriteStream(path[, options])
参数说明:
- path 文件路径
- options 选项配置(可选)
返回值: Object
注意
程序打开一个文件是需要消耗资源的,流式写入可以减少打开关闭文件的次数
流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景
const fs = require('fs')
// 创建写入流对象
const ws = fs.createWriteStream('./观书有感.txt')
// write
ws.write('半亩方塘一鉴开\r\n')
ws.write('天光云影共徘徊\r\n')
ws.write('问渠那得清如许\r\n')
ws.write('为有源头活水来\r\n')
// 关闭通道
ws.close()
2
3
4
5
6
7
8
9
10
11
12
13
# 文件写入应用场景
文件写入在计算机中是一个非常常见的操作,下面的场景都用到了文件写入
- 下载文件
- 安装软件
- 保存程序日志,如Git
- 编辑器保存文件
- 视频录制
当需要持久化保存数据的时候,应该想到文件写入
# 文件读取
# realFile 异步读取
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.toString())
})
2
3
4
5
6
7
8
9
10
# 文件读取应用场景
- 电脑开机
- 程序运行
- 编辑器打开文件
- 查看图片
- 播放视频
- 播放音乐
- Git查看日志
- 上传文件
- 查看聊天记录
# 文件流式读取
const fs = require('fs')
// 创建读取流对象
const rs = fs.createReadStream('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')
// 绑定data事件
rs.on('data', chunk => {
console.log(chunk)
})
// end 可选事件
rs.on('end',() => {
console.log('读取完成')
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
文件读取每次会读出64kb的数据
# 文件复制
/**
* 需求:
* 复制【资料】文件夹下的【笑看风云.mp4】
*/
const fs = require('fs')
// 方式一 readFile
// 读取文件内容
let data = fs.readFileSync('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')
// 写入文件
fs.writeFileSync('./copy.md', data)
// 方式二 流式操作
// 创建读取流对象
const rs = fs.createReadStream('../02-快速入门Cocos Creator资料/01_讲义/快速入门.md')
// 创建写入流对象
const ws = fs.createWriteStream('./copy.md')
// 绑定data事件
rs.on('data', chunk => {
ws.write(chunk)
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
第二种要好一些,理想状态下只要有64kb的内存就可以完成复制
# 文件重命名和移动
可以使用rename
或renameSync
来移动或重命名文件或文件夹,语法:
fs.rename(oldPath, newPath, callback)
fa.renameSync(oldPath, newPath)
const fs = require('fs')
// 重名名
fs.rename('./座右铭.txt', './论语.txt', err => {
if(err) {
console.log('操作失败')
return
}
console.log('操作成功')
})
// 移动文件
fs.rename('./观书有感.txt', './资料/观书有感.txt', err => {
if(err) {
console.log('操作失败')
return
}
console.log('操作成功')
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 文件删除
使用unlink 或 unlinkSync, rm ,rmSync 来删除文件
fs.unlink(path, callback)
fs.unlinkSync(path)
fs.rm(path, callback)
fs.rmSync(path)
const fs = require('fs')
// 调用unlink方法
fs.unlink('./资料/观书有感.txt', err => {
if(err) {
console.log('删除失败')
return
}
console.log('删除成功')
})
// 调用rm方法
fs.rm('./论语.txt',err => {
if(err) {
console.log('删除失败')
return
}
console.log('删除成功')
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 文件夹操作
# 创建
mkdir, mkdirSync
fs.mkdir(path [, options] , callback)
fs.mkdirSync(path [,options])
# 读取
readdir, readdirSync
# 删除
rmdir, rmdirSync
const fs = require('fs')
// 创建文件夹 mk make 制作 dir directory 文件夹
// 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('创建成功')
})
// 读取文件夹 read 读取 dir directory 文件夹
fs.readdir('./资料',(err, data) => {
if(err) {
console.log('读取失败')
return
}
console.log(data)
})
// 删除文件夹 rm remove 移除
fs.rmdir('./html', err => {
if(err) {
console.log('删除失败')
return
}
console.log('删除成功')
})
// 递归删除,不推荐使用
fs.rmdir('./a',{recursive: true}, err => {
if(err) {
console.log('删除失败')
return
}
console.log('删除成功')
})
// 递归删除, 建议使用
fs.rm('./a',{recursive: true}, err => {
if(err) {
console.log('删除失败')
return
}
console.log('删除成功')
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 查看资源状态
stat, statSync
fs.stat(path [, options], callback) fs.statSync(path [, options])
结果值对象结构:
- size 文件体积
- birthtime 创建时间
- mtime 最后修改时间
- isFile 检测是否为文件
- isDirectory 检测是否为文件夹
- atime 最后的访问时间
- ctime 最后一次修改文件状态的时间
# 路径补充说明
fs模块怼资源进行操作时,路径的写法有两种:
相对路径
- ./座右铭.txt 当前目录下的座右铭.txt
- 座右铭.txt 等效于上面的写法
- ../座右铭.txt 当前目录的上一级目录中的座右铭.txt
绝对路径
- D:/Program Files windows系统下的绝对路径
- /user/bin Linux系统下的绝对路径
# 相对路径的Bug与解决
__dirname : 所在文件的所在目录的绝对路径
# path模块
path模块提供了操作路径的功能:
API | 说明 |
---|---|
path.resolve | 拼接规范的绝对路径 |
path.sep | 获取操作系统的路径分隔符 |
path.parse | 解析路径并返回对象 |
path.basename | 获取路径的基础名称 |
path.dirname | 获取路径的目录名 |
path.extname | 获得路径的扩展名 |
const fs = require('fs')
const path = require('path')
// resolve
console.log(path.resolve(__dirname, 'index.html'))
// E:\zz\node_study\index.html
// sep 分隔符
console.log(path.sep) // \
// parse 方法
console.log(__filename) // 文件的绝对路径
let str = 'E:\\zz\\node_study\\hello.js'
console.log(path.parse(str))
//{
// root: 'E:\\',
// dir: 'E:\\zz\\node_study',
// base: 'hello.js',
// ext: '.js',
// name: 'hello'
// }
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21