首页 > Js/Jquery

Node.js 文件系统fs模块

发表于2015-08-11 11:06:10| --次阅读| 来源webkfa| 作者js,javascript

摘要:Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX 文件系统操作。与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSy...

Node.js 文件系统封装在 fs 模块是中,它提供了文件的读取、写入、更名、删除、遍历目录、链接等POSIX 文件系统操作。

与其他模块不同的是,fs 模块中所有的操作都提供了异步的和 同步的两个版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。我们以几个函数为代表,介绍 fs 常用的功能,并列出 fs 所有函数 的定义和功能。

一、fs 模块函数表

二、fs 部分API

fs.readFile

Node.js读取文件函数语法如下:

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' }

fs.readFileSync

fs.readFileSync(filename, [encoding])是 fs.readFile 同步的版本。它接受 的参数和 fs.readFile 相同,而读取到的文件内容会以函数返回值的形式返回。如果有错 误发生,fs 将会抛出异常,你需要使用 try 和 catch 捕捉并处理异常。

注意:与同步I/O 函数不同,Node.js 中异步函数大多没有返回值。


fs.open

fs.open(path, flags, [mode], [callback(err, fd)])是POSIX open 函数的 封装,与C 语言标准库中的 fopen 函数类似。它接受两个必选参数,path 为文件的路径, flags 可以是以下值。

  • r :以读取模式打开文件。
  • r+ :以读写模式打开文件。
  • w :以写入模式打开文件,如果文件不存在则创建。
  • w+ :以读写模式打开文件,如果文件不存在则创建。
  • a :以追加模式打开文件,如果文件不存在则创建。
  • a+ :以读取追加模式打开文件,如果文件不存在则创建

fs.read

fs.read语法格式如下:

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

参数说明:

  • fd: 读取数据并写入 buffer 指向的缓冲区对象。
  • offset: 是buffer 的写入偏移量。
  • length: 是要从文件中读取的字节数。
  • position: 是文件读取的起始位置,如果 position 的值为 null,则会从当前文件指针的位置读取。
  • callback:回调函数传递bytesRead 和 buffer,分别表示读取的字节数和缓冲区对象。

以下是一个使用 fs.open 和 fs.read 的示例。

var fs = require('fs'); fs.open('content.txt', 'r', function(err, fd) { if(err) { console.error(err); return; } var buf = newBuffer(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>

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

 

三、Fs与Stream重要

  "Stream" 具有异步的特性。我么可以将一个文件或一段内容分为未知个制定大小的 "chunk" 去读取,每读取到一个 "chunk" 我们就将他输出。直到文件读完。这就像 "http1.1" 种支持的 "Transfer-Encoding: chunked" 那样。 ("chunk"可以以任何的形式存在,NodeJS默认是以 "Buffer" 的形式存在,这样更高效)。NodeJS中的"Stream"具备Unix系统上的一个超级特性就是 ("pipe" ------ 管道)。

  createReadStream()

  createReadStream方法往往用于打开大型的文本文件,创建一个读取操作的数据流。所谓大型文本文件,指的是文本文件的体积很大,读取操作的缓存装不下,只能分成几次发送,每次发送会触发一个data事件,发送结束会触发end事件。

var fs = require('fs');

function readLines(input, func) {
  var remaining = '';

  input.on('data', function(data) {
    remaining += data;
    var index = remaining.indexOf('\n');
    var last  = 0;
    while (index > -1) {
      var line = remaining.substring(last, index);
      last = index + 1;
      func(line);
      index = remaining.indexOf('\n', last);
    }

    remaining = remaining.substring(last);
  });

  input.on('end', function() {
    if (remaining.length > 0) {
      func(remaining);
    }
  });
}

function func(data) {
  console.log('Line: ' + data);
}

var input = fs.createReadStream('lines.txt');
readLines(input, func);

  注意:这里创建文件流可能会导致buffer编码的问题(中文出现乱码),这里我们可以设置编码来避免,例:

var rs = fs.createReadStream('testdata.md',{encoding:'utf-8',bufferSize:11});

或者
var rs = fs.createReadStream('testdata.md',{bufferSize:11});
rs..setEncoding("utf8");

  目前Node.js仅支持hex(二进制),utf8,ascii,binary,base64,ucs2几种编码的转换。对于那些因为历史遗留问题依旧还生存着GBK,GB2312等编码,改方法无能为力。

 

  createWriteStream()

  createWriteStream方法创建一个写入数据流对象,该对象的write方法用于写入数据,end方法用于结束写入操作。

var out = fs.createWriteStream(fileName, { encoding: "utf8" });
out.write(str);
out.end();

 

参考资料:

  http://nodejs.org/api/fs.html

 fs 模块 http://javascript.ruanyifeng.com/nodejs/fs.html

 Node.js学习(10)----文件系统fs  http://blog.csdn.net/gxhacx/article/details/12430969

 大熊君大话NodeJS之------FS文件模块 http://www.cnblogs.com/bigbearbb/p/4215013.html

 nodejs文件操作模块FS(File System)常用函数简明总结 http://www.jb51.net/article/50667.htm

 node 的文件操作 :http://blog.chinaunix.net/uid-26672038-id-4139323.html

相关文章

猜你喜欢

学到老在线代码浏览器 关闭浏览
友情链接: hao123 360导航 搜狗网址导航 114啦网址导航 博客大全
Copyright © 1999-2014, WEBKFA.COM, All Rights Reserved  京ICP备14034497号-1