Node.js 文件系統fs模塊


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();

 

例子,將讀到的流pipe輸到頁面上面:

var http = require("http");
var fs = require("fs");


var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain;charset=UTF-8'});
  //將讀到的流導到頁面上面
  fs.createReadStream('./11.png').pipe(res);
  //不能寫其他的res
  //res.write('Hello World\n');
}).listen(8000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8000/');

 

參考資料:

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM