文件读写

同步方法和异步方法

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

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

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

文件的读写操作

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,写入文件后的回调函数

下面是一个简易的例子

  1. var fs = require('fs')
  2. var txt = '写入测试数据\r\n成功'
  3.  
  4. fs.readFile('./text.txt', 'utf8', (err, data) => {
  5. if(err) {
  6. console.log('读取文件失败')
  7. } else {
  8. console.log(data)
  9. }
  10. })
  11.  
  12. fs.writeFile('./text.txt', txt, 'utf8', (err) => {
  13. if(err) {
  14. console.log('写入文件失败')
  15. } else {
  16. console.log('写入文件成功')
  17. }
  18. })

与异步操作对应的有同步操作,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,文件描述符

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

下面是一个简易例子

  1. var fs = require('fs')
  2. // 打开文件
  3. fs.open('./message.txt', 'r', function(err, fd) {
  4. // 创建缓存区,用于将文件数据读取到缓存区
  5. var buf = new Buffer(255)
  6. // 读取文件
  7. fs.read(fd, buf, 0, 9, 3, function(err, bytesRead, buffer) {
  8. console.log(buffer.slice(0, bytesRead).toString())
  9. // 从文件的当前读取位置继续往下读取
  10. fs.read(fd, buf, 0, 3, null, function(err, bytesRead, buffer) {
  11. console.log(buffer.slice(0, bytesRead).toString())
  12. // 关闭文件
  13. fs.close(fd)
  14. })
  15. })
  16. })
  17. // 创建缓存区
  18. var buf = new Buffer('我喜爱编程')
  19. // 打开文件
  20. fs.open('./anotherMessage.txt', 'wx', function(err, fd) {
  21. // 写文件
  22. fs.write(fd, buf, 0, 15, 0, function(err, written, buffer) {
  23. if (err) {
  24. console.log('写文件操作失败')
  25. } else {
  26. console.log('写文件操作成功')
  27. }
  28.  
  29. // 把剩余所有数据写入文件中
  30. fs.fsync(fd)
  31. // 关闭文件
  32. fs.close(fd)
  33. })
  34. })