Node.js学习笔记之fs

fs 模块中所有的操作都提供了异步的和 同步的两个版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。


fs.readFile
fs.readFile(filename,[encoding],[callback(err,data)])是最简单的读取 文件的函数。它接受一个必选参数 filename,表示要读取的文件名。第二个参数 encoding 是可选的,表示文件的字符编码。callback 是回调函数,用于接收文件的内容。如果不指 定 encoding,则 callback 就是第二个参数。回调函数提供两个参数 err 和 data,err 表 示有没有错误发生,data 是文件内容。如果指定了 encoding,data 是一个解析后的字符 串,否则 data 将会是以 Buffer 形式表示的二进制数据。
例如以下程序,从 content.txt 中读取数据,但不指定编码:

var fs = require('fs');  

fs.readFile('content.txt', function(err, data) { 
  if (err) { 
    console.error(err); 
  } else { 
    console.log(data); 
  } 
}); 

假设 content.txt 中的内容是 UTF-8 编码的 Text 文本文件示例,运行结果如下:

<Buffer 54 65 78 74 20 e6 96 87 e6 9c ac e6 96 87 e4 bb b6 e7 a4 ba e4 be 8b> 

这个程序以二进制的模式读取了文件的内容,data 的值是 Buffer 对象。如果给 fs.readFile 的 encoding 指定编码:

var fs = require('fs');  

fs.readFile('content.txt', 'utf-8', function(err, data) { 
  if (err) { 
    console.error(err); 
  } else { 
    console.log(data); 
  } 
}); 

那么运行结果则是:

Text 文本文件示例 

当读取文件出现错误时,err 将会是 Error 对象。如果 content.txt 不存在,运行前面 的代码则会出现以下结果:

{ [Error: ENOENT, no such file or directory 'content.txt'] errno: 34, code: 'ENOENT', 
path: 'content.txt' } 

Node.js 的异步编程接口习惯是以函数的后一个参数为回调函数,通 常一个函数只有一个回调函数。回调函数是实际参数中第一个是 err,其 余的参数是其他返回的内容。如果没有发生错误,err 的值会是 null 或 undefined。如果有错误发生,err 通常是 Error 对象的实例。


fs.open
fs.open(path, flags, [mode], [callback(err, fd)])接受两个必选参数,path 为文件的路径, flags 可以是以下值。
r :以读取模式打开文件。
r+ :以读写模式打开文件。
w :以写入模式打开文件,如果文件不存在则创建。
w+ :以读写模式打开文件,如果文件不存在则创建。
a :以追加模式打开文件,如果文件不存在则创建。
a+ :以读取追加模式打开文件,如果文件不存在则创建。
mode 参数用于创建文件时给文件指定权限,默认是 0666。回调函数将会传递一个文件描述符 fd。


fs.read
fs.read(fd, buffer, offset, length, position, [callback(err, bytesRead, buffer)])

相比 fs.readFile 提供了更底层的接口。
fs.read 的功能是从指定的文件描述符 fd 中读取数据并写入 buffer 指向的缓冲区对象。
offset 是 buffer 的写入偏移量。
length 是要从文件中读取的字节数。
position 是文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
回调函数传递 bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。

var fs = require('fs');  
fs.open('content.txt', 'r', function(err, fd) { 
  if (err) { 
    console.error(err); 
    return; 
  } 

  var buf = new Buffer(8); 
  fs.read(fd, buf, 0, 8, null, function(err, bytesRead, buffer) { 
    if (err) { 
      console.error(err); 
      return; 
    } 

    console.log('bytesRead: ' + bytesRead); 
    console.log(buffer); 
  }) 
}); 

运行结果则是:

bytesRead: 8 
<Buffer 54 65 78 74 20 e6 96 87> 

一般来说,除非必要,否则不要使用这种方式读取文件,因为要求手动管理缓冲区和文件指针,尤其是在你不知道文件大小的时候,这将会是一件很麻烦的事情。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值