1. 程式人生 > >node總結之檔案操作系列(一)

node總結之檔案操作系列(一)

Node.js 提供一組類似 UNIX(POSIX)標準的檔案操作API,我們來看下Node 匯入檔案系統模組(fs)語法,如下:

var fs = require("fs")

Node.js 檔案系統(fs 模組)模組中的方法均有非同步和同步版本,例如讀取檔案內容的函式有非同步的 fs.readFile() 和同步的 fs.readFileSync()。其中,非同步的方法函式最後一個引數為回撥函式,回撥函式的第一個引數包含了錯誤資訊(error)。個人建議大家使用非同步方法,比起同步,非同步方法效能更高,速度更快,而且沒有阻塞,來看測試檔案input.txt 檔案,內容如下:

luyaran is my lover

先來看一個例項:

var fs = require("fs");

// 非同步讀取
fs.readFile('input.txt', function (err, data) {
   if (err) {
       return console.error(err);
   }
   console.log("非同步讀取: " + data.toString());
});

// 同步讀取
var data = fs.readFileSync('input.txt');
console.log("同步讀取: " + data.toString());

console.log("程式執行完畢。");

我們來看下在非同步模式下開啟檔案的語法格式,如下:

fs.open(path, flags[, mode], callback)

引數描述如下:

  • path - 檔案的路徑。

  • flags - 檔案開啟的行為。具體值詳見下文。

  • mode - 設定檔案模式(許可權),檔案建立預設許可權為 0666(可讀,可寫)。

  • callback - 回撥函式,帶有兩個引數如:callback(err, fd)。

來看下flags 引數具體可以使用那些值:

Flag 描述
r 以讀取模式開啟檔案。如果檔案不存在丟擲異常。
r+ 以讀寫模式開啟檔案。如果檔案不存在丟擲異常。
rs 以同步的方式讀取檔案。
rs+ 以同步的方式讀取和寫入檔案。
w 以寫入模式開啟檔案,如果檔案不存在則建立。
wx 類似 'w',但是如果檔案路徑存在,則檔案寫入失敗。
w+ 以讀寫模式開啟檔案,如果檔案不存在則建立。
wx+ 類似 'w+', 但是如果檔案路徑存在,則檔案讀寫失敗。
a 以追加模式開啟檔案,如果檔案不存在則建立。
ax 類似 'a', 但是如果檔案路徑存在,則檔案追加失敗。
a+ 以讀取追加模式開啟檔案,如果檔案不存在則建立。
ax+ 類似 'a+', 但是如果檔案路徑存在,則檔案讀取追加失敗。

看下例項:

var fs = require("fs");

// 非同步開啟檔案
console.log("準備開啟檔案!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("檔案開啟成功!");     
});

再來看下通過非同步模式獲取檔案資訊的語法格式:

fs.stat(path, callback)

引數描述如下:

  • path - 檔案路徑。

  • callback - 回撥函式,帶有兩個引數如:(err, stats), stats 是 fs.Stats 物件。

fs.stat(path)執行後,會將stats類的例項返回給其回撥函式,我們可以通過stats類中的提供方法判斷檔案的相關屬性。來看下判斷是否為檔案的例項:

var fs = require('fs');

fs.stat('/Users/liuht/code/itbilu/demo/fs.js', function (err, stats) {
    console.log(stats.isFile());         //true
})

再來看下stats類中的方法:

方法 描述
stats.isFile() 如果是檔案返回 true,否則返回 false。
stats.isDirectory() 如果是目錄返回 true,否則返回 false。
stats.isBlockDevice() 如果是塊裝置返回 true,否則返回 false。
stats.isCharacterDevice() 如果是字元裝置返回 true,否則返回 false。
stats.isSymbolicLink() 如果是軟連結返回 true,否則返回 false。
stats.isFIFO() 如果是FIFO,返回true,否則返回 false。FIFO是UNIX中的一種特殊型別的命令管道。
stats.isSocket() 如果是 Socket 返回 true,否則返回 false。

例項如下:

var fs = require("fs");

console.log("準備開啟檔案!");
fs.stat('input.txt', function (err, stats) {
   if (err) {
       return console.error(err);
   }
   console.log(stats);
   console.log("讀取檔案資訊成功!");
   
   // 檢測檔案型別
   console.log("是否為檔案(isFile) ? " + stats.isFile());
   console.log("是否為目錄(isDirectory) ? " + stats.isDirectory());    
});

再來看下非同步模式下寫入檔案的語法格式:

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

可能有過經驗的知道,writeFile 直接開啟檔案預設是 w 模式,所以如果檔案存在,該方法寫入的內容會覆蓋舊的檔案內容,但是,fs.writeFile 並不一定是覆蓋原來檔案內容,而是取決於開啟檔案時帶的 flags。如果我們是通過 writeFile 直接開啟檔案,那麼預設是 w 模式,但是也可以通過 open 開啟檔案指定模式,然後通過 writeFile 來寫檔案,來看例項:

fs.open(fileName, "a+", function(err, fd){
    if (err) {
        return console.error(err);
    }
    fs.writeFile(fd, "bb", function(err){
        if (err){
            return console.error(err);
        }
    });
});

上述程式碼的writeFile 是追加模式寫檔案。

咱接著剛剛的來,看下引數描述:

  • file - 檔名或檔案描述符。

  • data - 要寫入檔案的資料,可以是 String(字串) 或 Buffer(緩衝) 物件。

  • options - 該引數是一個物件,包含 {encoding, mode, flag}。預設編碼為 utf8, 模式為 0666 , flag 為 'w'

  • callback - 回撥函式,回撥函式只包含錯誤資訊引數(err),在寫入失敗時返回。

來看完整例項:

var fs = require("fs");

console.log("準備寫入檔案");
fs.writeFile('input.txt', '我是通 過fs.writeFile 寫入檔案的內容',  function(err) {
   if (err) {
       return console.error(err);
   }
   console.log("資料寫入成功!");
   console.log("--------我是分割線-------------")
   console.log("讀取寫入的資料!");
   fs.readFile('input.txt', function (err, data) {
      if (err) {
         return console.error(err);
      }
      console.log("非同步讀取檔案資料: " + data.toString());
   });
});

最後就是非同步模式下讀取檔案的語法格式:

fs.read(fd, buffer, offset, length, position, callback)

這個方法會使用檔案描述符來讀取檔案,來看引數描述:

  • fd - 通過 fs.open() 方法返回的檔案描述符。

  • buffer - 資料寫入的緩衝區。

  • offset - 緩衝區寫入的寫入偏移量。

  • length - 要從檔案中讀取的位元組數。

  • position - 檔案讀取的起始位置,如果 position 的值為 null,則會從當前檔案指標的位置讀取。

  • callback - 回撥函式,有三個引數err, bytesRead, buffer,err 為錯誤資訊, bytesRead 表示讀取的位元組數,buffer 為緩衝區物件。

例項如下:

var fs = require("fs");
var buf = new Buffer.alloc(1024);

console.log("準備開啟已存在的檔案!");
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
   console.log("檔案開啟成功!");
   console.log("準備讀取檔案:");
   fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
      if (err){
         console.log(err);
      }
      console.log(bytes + "  位元組被讀取");
      
      // 僅輸出讀取的位元組
      if(bytes > 0){
         console.log(buf.slice(0, bytes).toString());
      }
   });
});

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。