文件读写

同步方法和异步方法

在Nodejs中,使用fs模块来实现有关文件及目录的创建、写入及删除操作,此中所有操作都可以使用同步和异步两种方式。

// 同步方法
var fs = require('fs')
var data = fs.readFile('./text.txt', 'utf8')

// 等待操作返回结果
console.log(data)
// 异步方法
var fs = require('fs')
fs.readFile('./text.txt', (err, data) => {
    // 操作结果作为回调函数参数返回
    console.log(data)
})

同步与异步的区别在于: 同步方法立即返回操作结果,但在使用同步方法执行的操作结束之前,不能执行后续代码。 而异步方法将操作结果作为回调函数的参数进行返回,在方法调用之后,可以立即执行后续代码。

文件的读写操作

readFile & writeFile

fs.readFile(filename, [options], callback)

在readFile函数中,接受三个参数:

  • filename,用于指定读取文件的完整文件路径及文件名
  • options,指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认为’r’。另外,可以使用encoding属性指定编码格式
  • callback,读取文件后的回调函数

fs.writeFile(filename, data, [options], callback)

在writeFile函数中,接受四个参数:

  • filename,用于指定读取文件的完整文件路径及文件名
  • data,用于指定要写入的内容
  • options,指定读取文件时需要使用的选项,在该参数值对象中可以使用flag属性指定对该文件采取什么操作,默认为’r’。另外,可以使用encoding属性指定编码格式
  • callback,写入文件后的回调函数

下面是一个简易的例子

var fs = require('fs')
var txt = '写入测试数据\r\n成功'

fs.readFile('./text.txt', 'utf8', (err, data) => {
    if(err) {
        console.log('读取文件失败')
    } else {
        console.log(data)
    }
})

fs.writeFile('./text.txt', txt, 'utf8', (err) => {
    if(err) {
        console.log('写入文件失败')
    } else {
        console.log('写入文件成功')
    }
})

与异步操作对应的有同步操作,readFileSync 和 writeFileSync。

readFile 和 writeFile 这两个方法,是读取文件里的所有数据,那如果我们只是想读取文件的某部分数据,应该怎么做呢?

这就涉及到 read & write 这两个方法了

read & write

read & write 涉及到读取或写入文件的具体数据,两者需要配合 open & close 来使用。

fs.open(filename, flags, [mode], function(err, fd){})

  • filename,用于指定读取文件的完整文件路径及文件名
  • flags,指定对该文件采取什么操作,默认为’r’
  • mode,用于指定对该文件的读写权限,默认值为0666

fs.close(fd, [callback])

  • fd,文件描述符
  • callback,关闭文件后的回调函数

fs.read(fd, buffer, offset, length, position, function(err, bytesRead, buffer) {})

  • fd,文件描述符
  • buffer,Buffer对象,用于指定将文件数据读取到哪个缓存区中
  • offset,为整数值,用于指定向缓存区中写入数据时的开始写入位置(以字节为单位)
  • length,为整数值,用于指定从文件中读取的字节数
  • position,为整数值,用于指定读取文件时的开始位置(以字节为单位)
  • callback,用于指定文件读取操作执行完毕时执行的函数
    • err 读取文件操作失败时触发的错误对象
    • bytesRead 实际读取的字节数
    • buffer 表示被读取的缓存区对象

fs.write(fd, buffer, offset, length, position, function(err, written, buffer) {})

  • fd/buffer/offset/length/position ,参数取值及意义同read函数一致

fs.fsync(fd, [callback])

  • fd,文件描述符

如何使用这几个函数,来达到读取/写入部分数据到文件呢?

下面是一个简易例子

var fs = require('fs')
// 打开文件
fs.open('./message.txt', 'r', function(err, fd) {
    // 创建缓存区,用于将文件数据读取到缓存区
    var buf = new Buffer(255)
    // 读取文件
    fs.read(fd, buf, 0, 9, 3, function(err, bytesRead, buffer) {
        console.log(buffer.slice(0, bytesRead).toString())
        // 从文件的当前读取位置继续往下读取
        fs.read(fd, buf, 0, 3, null, function(err, bytesRead, buffer) {
            console.log(buffer.slice(0, bytesRead).toString())
            // 关闭文件
            fs.close(fd)
        })
    })
})
// 创建缓存区
var buf = new Buffer('我喜爱编程')
// 打开文件
fs.open('./anotherMessage.txt', 'wx', function(err, fd) {
    // 写文件
    fs.write(fd, buf, 0, 15, 0, function(err, written, buffer) {
        if (err) {
            console.log('写文件操作失败')
        } else {
            console.log('写文件操作成功')
        }

        // 把剩余所有数据写入文件中
        fs.fsync(fd)
        // 关闭文件
        fs.close(fd)
    })
})