二、fs
file system 系统文件的缩写
可以实现与硬盘的交互,例如文件的创建删除、重命名、移动、文件的写入读取、文件夹相关的操作
-
文件写入
| writeFile | 异步写入 |
|---|---|
| writeFileSync | 同步写入 |
| appendFile / appendFileSync | 强迫写入 |
| createWriteStream | 流式写入 |
writeFile 异步写入
语法:fs.writeFile(文件名, 写入的数据[, 选项设置], 回调)
返回值:undefined
fs.writeFile('./01-1-test.txt', '学习fs', err => {
// 失败 错误对象
// 成功 null
if (err) {
console.log('失败')
return
}
console.log('success')
})
writeFileSync 同步写入
fs.writeFileSync('./01-2-writeFileSync.txt', 'writeFileSync')
appendFile / appendFileSync 追加写入
作用是在文件尾部追加内容,与writeFile语法完全相同
返回值:两者都为undefined
const fs = require('fs')
fs.appendFile('./02-1-addendFile.txt', '\n追加写入的内容', err => {
if (err) {
console.log('失败')
return
}
console.log('success')
})
使用writeFile也可以实现追加写入内容
第三个参数写入{flag:'a'}
fs.writeFile('./02-1-addendFile.txt', '\nwriteFile追加写入', { flag: 'a' }, err => {
if (err) {
console.log('失败')
return
}
console.log('success')
})
createWriteStream 流式写入
语法:fs.createWriteStream(path[, oprions])
参数说明:
path 文件路径
options 选项配置,可选
返回值:Object
const fs = require('fs')
const date = new Date().getTime()
// 创建写入流对象
const ws = fs.createWriteStream(`./03-1-${date}.txt`)
// 写入
ws.write('第一行\n')
ws.write('第二行\n')
ws.write('第三行\n')
ws.write('第四行\n')
// 关闭写入流
ws.close()
程序打开一个文件需要消耗资源,流式写入可以减少打开关闭文件的次数
流式写入方式适用于大文件写入或者频繁写入的场景,writeFile适合于写入频率较低的场景
写入文件场景
文件写入在计算机中是个非常常见的操作,下面的场景都用到了文件写入
- 下载文件
- 安装软件
- 保存程序日志,如git
- 编辑器保存文件
- 视频录制
当需要持久化保存数据的时候,应该想到文件写入
-
文件读取
| readFile | 异步读取 |
|---|---|
| readFileSync | 同步读取 |
| createReadStream | 流式读取 |
readFile 异步读取
语法:fs.readFile(path[, options], callback)
参数说明:
path 文件路径
options 选项配置
callback 回调函数
readFileSync 同步读取
const readFileSyncData = fs.readFileSync('./03-1-1735540856673.txt')
console.log("readFileSyncData", readFileSyncData.toString())
createReadStream 流式读取
读取文件时每次读取64kb,一块一块的读取
const fs = require('fs')
const rs = fs.createReadStream('./屏幕录制2025-01-02 09.34.52.mov')
// 绑定data事件 chunk块
rs.on('data', chunk => {
console.log(chunk.length) // 65536字节 => 64KB
})
rs.on('end', () => {
console.log('over')
})
读取文件应用场景
- 电脑开机
- 程序运行
- 编辑器打开软件
- 查看图片
- 播放视频
- 播放音乐
- git查看日志
- 上传文件
- 查看聊天记录
-
文件移动和重命名
fs.rename(oldPath, newPath, callback)
fs.renameSync(oldPath, newPath)
fs.rename('./07-1.js', '../移动文件.js', err => {
if (err) {
console.log(err)
return
}
console.log('success')
})
fs.renameSync('../移动文件.js', './重命名.js')
-
文件删除
fs.unlink('./07-1-重命名.js', err => {
console.log(err)
})
fs.unlinkSync('./03-1-1735540837796.txt')
fs.rm('./06-1735785828547.mp4', err => {
console.log(err)
})
fs.rmSync('./03-1-1735540837796.txt')
node14.4版本引入的新方法: fs.rm
-
文件夹操作
| mkdir / mkdirSync | 创建 |
|---|---|
| readdir / readdirSync | 读取 |
| rmdir / rmdirSync | 删除 |
mkdir / mkdirSync 创建
fs.mkdir(path[, options], callback)
fs.mkdir(path[, options])
fs.mkdir('./test', err => {
console.log(err)
})
fs.mkdirSync('./test1')
递归创建 添加 recursive: true
fs.mkdir('./test/a/b/c', { recursive: true }, err => {
console.log(err)
})
readdir / readdirSync 读取
fs.readdir('../03-fs模块', (err, data) => {
console.log(err)
console.log(data)
})
const data = fs.readdirSync('../03-fs模块')
console.log(data)
rmdir / rmdirSync 删除
// 删除文件夹
fs.rmdir('./test/a/b/c', err => {
console.log(err)
})
fs.rmdirSync('./test/a/b')
// 递归删除文件夹 recursive马上会被弃用 不推荐使用
fs.rmdir('./test', { recursive: true }, err => {
console.log(err)
})
// 建议使用
fs.rm('./test', { recursive: true }, err => {
console.log(err)
})
-
查看资源状态
fs.stat(path[, options], callback)
fs.statSync(path[, options])
三、path模块
path提供了操作路径的功能
| resolve | 拼接规范的绝对路径 |
|---|---|
| sep | 获取操作系统的路径分隔符 |
| parse | 解析路径并返回对象 |
| basename | 获取路径的基础名称 |
| dirname | 获取路径的目录名 |
| extname | 获取路径的扩展名 |