Node核心基础——文件系统(文件I/O)

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("删除成功")
})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值