一、定义:
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、文件的移动:
移动和重命名一样,只是改变了文件的路径