fs模块
fs是file system的缩写,意思是文件系统。fs模块中存放了所有文件查询和操作函数,利用这些函数,可以查询文件的统计信息、打开文件、读写文件和关闭文件。
1、打开文件 open()
在读取或者处理文件之前,必须首先使用fs.open函数打开文件,然后使用文件描述符调用随提供的回调函数,稍后就可以使用这个回调函数打开文件进行读写。
const fs = require("fs")
fs.open("./test.txt", "r", (err,fd) => {
// 获取文件描述符 fd
})
open函数的第一个参数是文件路径,第二个参数是一个标志位,表示文件以何种模式开发
r | 打开文本进行读取。数据流的位置在文件的起始处 |
---|---|
r+ | 打开文件进行读写,数据流的位置在文件的起始处 |
w | 如果文件存在,将其清零,如果不存在,就创建文件写入数据,数据流在文件的起始处 |
w+ | 打开文件进行读写,如果文件不存在就创建它,如果存在就清零,数据流在文件的起始处 |
a | 打开文件写入数据,如果文件不存在就创建它,如果存在就将文件清零,数据流的位置在文件的结尾处,此后读写操作都将数据追加到文件后面 |
a+ | 打开文件进行读写,如果文件不存在就创建它,如果存在就将文件清零,数据流的位置在文件的结尾处,此后读写操作都将数据追加到文件后面 |
2、读取文件 read()
文件一旦打开,就可以进行读取,但是在读取之前,必须创建一个缓冲区来放置数据,缓冲区被传递到充满文件数据的read函数中
var fs = require("fs")
fs.open("./test.txt", "r", (err,fd) => {
var buffer = Buffer.alloc(20), // 创建一个20字节的缓冲区
bufferOffset = 0,
bufferLength = buffer.length,
filePosition = 0; // 文件定位到第0个
fs.read(fd, buffer, bufferOffset, bufferLength, filePosition, (err, data) => {
console.log("just read" + data + "bytes") // 返回的data是字节数
if (data > 0) {
console.log(buffer.slice(0, data), buffer.toString())
}
})
})
read函数有6个参数。
fd | 通过fs.open方法返回的文件描述符 |
---|---|
Buffer | 数据写入的缓冲区 |
offset | 缓冲区写入的偏移量 |
length | 要从文件中读取的字节数 |
position | 文件读取的起始位置,如果为null,则会从当前文件指针的位置读取 |
callback | 回调函数,有三个参数 err(错误信息),batesRead(读取的字节数),buffer(缓冲区对象) |
3、写入文件 write()
通过向write函数传递一个包含数据的缓冲区,可以向一个已打开的文件中写入数据。
fs.open("./test.txt", "a", (err, fd) => {
var writeBuffer = Buffer.from(`, \nwrite hello world ${new Date().getTime()}`),
bufferPosition = 0,
bufferLength = writeBuffer.length,
filePosition = null;
fs.write(fd, writeBuffer, bufferPosition, bufferLength, filePosition, (err, written) => {
if (err) {
console.log("写入失败");
return
}
console.log("写入成功");
})
})
4、关闭文件 close()
当Node进程结束之后,操作系统会确保所有文件都被关闭。然而在实际应用程序中,一旦打开一个文件,最终就必须关闭它,为此必须跟踪那些已经打开的文件描述符,在最后不再需要的时候用close函数关闭他们。
文件操作的简单写法
1、文件写入
const fs = require("fs")
fs.writeFile("./test.js", "console.log('hello wolrd')", err => {
if(err) throw err
console.log("写入成功")
})
2、流式写入
const fs = require("fs")
const ws = fs.creatWriteStream("./早发白帝城.txt") // 创建一个文件
// 流式写入:
ws.write("朝辞白帝彩云间,\n")
ws.write("千里江陵一日还。\n")
ws.write("两岸猿声啼不住,\n")
ws.write("轻舟已过万重山。\n")
ws.close()
fs.readFile("./早发白帝城.txt", (err, data) => {
console.log(data.toString())
})
// 流式写入可以在之前写入的文件中,追加写入,直到调用close方法结束。
3、文件读取
const fs = require("fs")
fs.readFile("./test.js", (err, data) => {
if (err) throw err
console.log("读取成功", data.toString()) // data是buffer对象,想要查看内容需要调用toString方法, 长度就是文件所占用的字节数。
})
4、流式读取
const fs = require("fs")
const rs = fs.createReadStream("./观书有感.txt")
rs.on("data", chunk => { // 绑定data事件,给data事件添加回调函数, 每当有数据读取到,就调用函数
console.log(chunk.length) // 至多64Kb,
})
rs.on("end", () => {
console.log("读取完毕")
})
流式读取就是给data事件绑定一个回调函数,每当有数据被读取到,就会执行此回调函数,注意:每次读取的数据量最多是64Kb
5、复制文件
复制文件的实现的方式有两种
1. 先读取再写入的方式
const fs = require("fs")
const data = fs.readFile("./早发白帝城.txt")
fs.write("./早发白帝城2.txt", data, err => {
if (err) throw err
console.log("复制完成")
})
2.流式操作,边读取,边写入,因为流式读取每次读取的大小仅为64Kb,所以理想情况下只占用64Kb的内存,但是一般情况下会多一些,因为写入的速度没有读取的速度快。
const rs = fs.createReadStream("./早发白帝城.txt") // 创建流式读取
const ws = fs.createWriteStream("./早发白帝城2.txt") // 创建流式写入
rs.on("data", chunk => { // 给流式读取绑定data事件,当有读取到数据,立即执行回调函数,将其写入另一个文件中
ws.write(chunk)
})
6、文件移动及重命名
文件重命名原理就是将就路径下的文件删除,将其复制到新的路径下,其文件移动也是同理。
const fs = require("fs")
// 重命名文件
fs.rename("./早发白帝城.txt", "./早发白帝城2.txt", err => {
if (err) throw err
console.log("重命名成功")
})
// 移动文件
fs.rename("./早发白帝城.txt", "../../早发白帝城.txt", err => {
if (err) throw err
console.log("移动成功")
})
7、文件删除
const fs = require("fs")
fs.unlink("./早发白帝城.txt", err => {
if (err) throw err
console.log("删除成功")
})