一、定义:
fs模块可以实现与硬盘的交互。例如:文件的创建、删除、重命名、移动;文件内容的写入、读取;文件夹的操作。
二、引入 fs 模块:
const fs = require('fs')
三、文件写入:
1、异步写入:writeFile
① 语法:
fs.writeFile(file,data[, options], callback)
② 参数说明:
(1)file:指定目标文件的路径或标识符。
类型:字符串、Buffer、URL 或文件描述符(整数)
如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。
(2)data:待写入的数据。
类型:字符串、Buffer、TypedArray、DataView
(3)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
utf8 - 作用:指定文本数据的编码格式,支持
ascii、base64、hex等
flag:
- 默认值:
w(覆盖写入,文件不存在则创建) - 其它值:
a:追加内容(文件不存在则创建)
wx:写入失败(若文件已存在)
(4)callback:回调函数。
写入完成后调用,会接收一个参数,写入成功,该参数为
null;写入失败,该参数为错误对象
③ 示例:
const fs = require('fs')
// 写入文件时建立连接,写入完毕断开连接
fs.writeFile("./fs1.txt", "异步文件写入的内容", err => {if (err) {console.log('写入失败:' + err)return}console.log('写入成功')
})
④ 使用场景:
适用于写入频次较低的场景
2、同步写入:writeFileSync
① 语法:
fs.writeFileSync(file,data[, options])
② 参数说明:
(1)file:指定目标文件的路径或标识符。
类型:字符串、Buffer、URL 或文件描述符(整数)
如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。
(2)data:待写入的数据。
类型:字符串、Buffer、TypedArray、DataView
(3)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
utf8 - 作用:指定文本数据的编码格式,支持
ascii、base64、hex等
flag:
- 默认值:
w(覆盖写入,文件不存在则创建) - 其它值:
a:追加内容(文件不存在则创建)
wx:写入失败(若文件已存在)
(3)示例:
const fs = require('fs')
fs.writeFileSync("./fs2.txt", "同步文件写入的内容")
3、异步追加写入:
① appendFile:
(1)语法:
fs.appendFile(path,data[, options], callback)
(2)参数说明:
a、path:文件名(所在的路径)。
类型:字符串、Buffer、URL 或文件描述符(整数)
如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。
b、data:待写入的数据。
类型:字符串、Buffer
\r\n 表示换行
c、options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
utf8 - 作用:指定文本数据的编码格式,支持
ascii、base64、hex等
flag:
- 默认值:
a(追加模式,文件不存在则创建) - 其它值:
a+:追加且可读
wx:文件存在时报错
d、callback:回调函数。
写入完成后调用,会接收一个参数,写入成功,该参数为
null;写入失败,该参数为错误对象
(3)示例:
const fs = require('fs')
fs.appendFile("./fs3.txt", "\r\n文件追加的内容", err => {if (err) {console.log('追加写入失败:'+err)return}console.log('追加写入成功')
})
② writeFile:
const fs = require('fs')
fs.writeFile("./fs3.txt", "配置文件追加写入---love",{flag: 'a'
}, err => {if (err) {console.log('追加写入失败:'+err)return}console.log('追加写入成功')
})
4、同步追加写入:appendFileSync
① 语法:
fs.appendFileSync(file,data[, options])
② 参数说明:
a、path:文件名(所在的路径)。
类型:字符串、Buffer、URL 或文件描述符(整数)
如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。
b、data:待写入的数据。
类型:字符串、Buffer
\r\n 表示换行
c、options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
utf8 - 作用:指定文本数据的编码格式,支持
ascii、base64、hex等
flag:
- 默认值:
a(追加模式,文件不存在则创建) - 其它值:
a+:追加且可读
wx:文件存在时报错
③ 示例:
const fs = require('fs')
fs.appendFileSync("./fs3.txt", "\r\n文件同步内容")
5、流式写入:createWriteStream
① 语法:
fs.createWriteStream(path[, options])
② 参数说明:
(1)path:文件名(所在的路径)。
类型:字符串、Buffer、URL 或文件描述符(整数)
如果路径中没有该文件,则会创建一个文件;如果路径中有该文件,默认会重写文件中的内容。
(2)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
utf8 - 作用:指定文本数据的编码格式,支持
ascii、base64、hex等
flags:
- 默认值:
w(覆盖写入,文件不存在则创建) - 其它值:
a:追加内容到文件末尾
r+:修改文件内容(非覆盖),需配合start参数指定写入位置
wx:文件存在时报错
autoClose:
- 默认值:
true(自动关闭文件描述符)。 - 作用:若设为
false,需手动调用close()关闭流
start:
- 作用:指定写入起始位置(字节偏移量),需在
r+'模式下生效
emitClose
- 默认值:
false(不触发close事件)。 - 作用:设为
true时,流销毁后会触发close事件
③ 返回值:
Object
④ 示例:
const fs = require('fs')
// 创建文件写入流对象,和文件建立连接
let ws = fs.createWriteStream("./fs4.txt")
// 写入内容,和文件不会断开连接
ws.write('春眠不觉晓\r\n')
ws.write('处处闻啼鸟\r\n')
ws.write('夜来风雨声\r\n')
ws.write('花落知多少\r\n')
// 断开连接 -- 可选,当脚本文件执行完毕后,资源会被回收,通道也会被断开。
ws.close()
⑤ 使用场景:
适用于大文件写入或者写入频次较高的场景
四、文件读取:
1、异步读取:fs.readFile
① 语法:
fs.readFile(path[, options], callback)
② 参数说明:
(1)path:指定目标文件的路径或标识符。
类型:字符串、Buffer、URL 或文件描述符(整数)
(2)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
null(返回原始Buffer数据) - 作用:指定文本内容的编码格式 ,可选值是
utf8、ascii、base64等
flag:
- 默认值:
r(以只读模式打开文件) - 其它值:
w:覆盖文件(文件不存在则创建)
a:追加内容(文件不存在则创建)
(3)callback:回调函数。
读取完成后调用,会接收两个参数。
参数1:写入成功,该参数为null;写入失败,该参数为错误对象
参数2:写入文件的内容
③ 示例:
const fs = require('fs')
fs.readFile('./fs5.txt', (err,data) => {if (err) {console.log('文件读取失败')return}// console.log(data)console.log(data.toString())
})
2、同步读取:fs.readFileSync
① 语法:
fs.readFileSync(path[, options])
② 参数说明:
(1)path:指定目标文件的路径或标识符。
类型:字符串、Buffer、URL 或文件描述符(整数)
若路径错误(如文件不存在或权限不足),会抛出
ENOENT错误
(2)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
null(返回原始Buffer数据) - 作用:指定文本内容的编码格式 ,可选值是
utf8、ascii、base64等
flag:
- 默认值:
r(以只读模式打开文件) - 其它值:
r+:读写模式
a:追加模式
③ 示例:
const fs = require('fs')
let data = fs.readFileSync('./fs5.txt')
console.log(data.toString())
3、流式读取:fs.createReadStream
① 语法:
fs.createReadStream(path[, options])
② 参数说明:
(1)path:文件名(所在的路径)。
类型:字符串、Buffer、URL 或文件描述符(整数)
若路径错误(如文件不存在或权限不足),会抛出
ENOENT错误
(2)options:配置项(可选)。
类型:字符串(仅编码格式)或对象(包含多个配置项)
常用属性:
encoding:
- 默认值:
null,返回Buffer - 作用:指定数据编码格式,支持
utf8、ascii、base64、hex等
flags:
- 默认值:
r(只读模式) - 其它值:
a:追加内容到文件末尾
r+:读写
wx:文件存在时报错
autoClose:
- 默认值:
true(自动关闭文件描述符)。 - 作用:若设为
false,需手动调用close()关闭流
start:
- 作用:读取起始字节位置(含)
end:
- 作用:读取结束字节位置(含)。若未指定
start,默认从文件头开始读取
③ 返回值:
Object
④ 示例:
const fs = require('fs')
// let rs = fs.createReadStream('./fs5.txt')
let rs = fs.createReadStream('./resource/food.mp4')
rs.on('data', chunk => { // 分块读取,每个块的最大容量为 65536字节 = 64KB// console.log(chunk) console.log(chunk.length)
})rs.on('end', () => {console.log('读取完毕')
})
五、文件复制:
1、全文件操作:
const fs = require('fs')
let fileData = fs.readFileSync('./resource/food.mp4')
fs.writeFile('./resource/food2.mp4',fileData, err => {if (err) {console.log(`文件复制失败--${err}`)return}console.log(`文件复制成功`)
})
2、流式文件操作:
const fs = require('fs')
const process = require('process')
let rs = fs.createReadStream("./resource/food.mp4")
let ws = fs.createWriteStream("./resource/food3.mp4")
// 方式一:
rs.on('data', chunk => {ws.write(chunk)
})
rs.on('end', () => {console.log(process.memoryUsage()) // { rss: 31657984, heapTotal: 5791744, heapUsed: 3381216,external: 10385147,arrayBuffers: 9269529 }console.log(`文件复制完毕,代码内存占用量:${process.memoryUsage().rss}`) // rss 31830016 = 30MB
})
// 方式二:
rs.pipe(ws)
六、文件的重命名与移动:
1、文件的重命名:
① 异步重命名:fs.rename
(1) 语法:
fs.rename(oldpath, newpath, callback)
(2) 参数说明:
a、oldpath:指定需重命名或移动的原始文件/目录路径。
类型:字符串、Buffer、URL 或文件描述符(整数)
若路径不存在或权限不足,回调函数会返回
ENOENT或EPERM错误
b、newpath:指定目标文件/目录的新路径或名称。
类型:字符串、Buffer、URL 或文件描述符(整数)
若
newPath已存在且为文件:直接覆盖原文件
若newPath为目录:抛出EISDIR错误
路径要求:目标路径的父目录必须存在,否则抛出ENOENT错误
c、callback:操作完成后的回调函数。
完成后调用,会接收一个参数,写入成功,该参数为
null;写入失败,该参数为错误对象
(3) 示例:
const fs = require('fs')
fs.rename('./fs5.txt', './红楼梦.txt', err => {if (err) {console.log('文件重命名失败')return}console.log('文件重命名成功')
})
② 同步重命名:
(1) 语法:
fs.renameSync(oldpath, newpath)
(2) 参数说明:
a、oldpath:指定需重命名或移动的原始文件/目录路径。
类型:字符串、Buffer、URL 或文件描述符(整数)
若路径不存在或权限不足,回调函数会返回
ENOENT或EPERM错误
b、newpath:指定目标文件/目录的新路径或名称。
类型:字符串、Buffer、URL 或文件描述符(整数)
若
newPath已存在且为文件:直接覆盖原文件
若newPath为目录:抛出EISDIR错误
路径要求:目标路径的父目录必须存在,否则抛出ENOENT错误
(3) 示例:
const fs = require('fs')
fs.renameSync('./resource/food2.mp4', './food.mp4')
2、文件的移动:
移动和重命名一样,只是改变了文件的路径
