1. 程式人生 > >Node.js中的檔案系統的簡要說明

Node.js中的檔案系統的簡要說明

在node.js中的有著檔案系統fs這樣一個自帶的模組,

我們在使用它的時候只需引入即可:

var fs =require('fs');

在fs這個模組中有許多的檔案操作API,在這裡我只說幾個我常見的API,

或者說我就是會這幾個API,哈哈哈!!!

在這之前,我想說明一下,我這裡只使用fs模組中的非同步方法,

事實上,node.js檔案系統模組中的方法均有非同步和同步操作的版本;

非同步的方法函式最後一個引數為回撥函式,回撥函式的第一個 引數是我們

知道的包含錯誤資訊的error引數;

由於方法的效能更高,速度更快,而且沒有阻塞,因此在一般情況下

我都是使用非同步方法;

一:開啟檔案 

其實一開始我也不理解為什麼要 開啟檔案,但是我們可以這樣理解,

在家裡一般會有水桶吧,你要是想取水的話是不是要先開啟桶蓋,或者

你想往水桶裡加水的時候,是不是也要開啟水桶蓋;

所以可以類比一下,開啟檔案就相當於開啟桶蓋應該就好理解;

說一下語法吧:

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

 引數的使用解釋一下:

path-------------檔案的路徑 

flags-------------檔案開啟的行為(例如:r,r+,w,w+等)

mode-----------設定文家模式,檔案預設許可權是0666(可讀,可寫)

callback--------回撥函式,帶有兩個引數例如:callback(error,fd)

在這裡我對callback回撥函式的第二個引數做一下解釋:

fd事實上就是一個檔案描述符,那什麼是檔案描述符呢,

就是一個代表這個檔案的一個編號吧,通過這個編號的操作就代表對這個檔案操作;

我就是這樣理解的;

//引入檔案模組
var fs = require("fs");

// 非同步開啟檔案
console.log("準備開啟input.txt檔案!");

//開啟檔案的方式為:以讀寫方式開啟檔案,如果檔案不存在,則丟擲異常;
fs.open('input.txt', 'r+', function(err, fd) {
   if (err) {
       return console.error(err);
   }
  console.log("檔案開啟成功!");     
});

 二:寫入檔案

就是把已有的資料寫入到檔案中;

語法如下:

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

 注意 :writeFile直接開啟檔案預設是 w模式,所以如果檔案存在,該方法寫入的內容會覆蓋舊的檔案的 內容 ;

引數如下:

file---------------檔名或者檔案描述符(fd)

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

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

callback---------回撥函式,回撥函式只包含錯誤資訊引數error,在寫入失敗時返回;

var fs=require('fs');

//再寫入檔案的時候預設是w方式寫入的,即檔案不存在即建立
fs.writeFile('input.txt','安徽的天氣一點不冷,很舒服的~~~!',function(error){
    if(error){
        console.log(error);
    }
    //讀取剛剛寫入的資料檔案
    fs.readFile('input.txt',function(error,data){
        if(error){
            console.log(error);
        }
        console.log('讀取的資料為:'+data.toString());
    });
});

console.log('程式結束!');

上述程式碼中:

file是input.txt;  data是一個String;   使用預設的options;   還有一個引數為error的回撥函式;

三:讀取檔案

語法:

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

注意這個方法與 readFile方法的區別;

readFile只是簡單的從一個檔案中讀取資料,然後通過回撥函式把資料返回 ;

而read方法則可以控制讀取的位元組數,以及其實讀取的位置來操作流式檔案

四:關閉檔案

語法:

fs.close(fd,callback)

 該方法使用了檔案描述符來讀取檔案;

引數:

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

callback---------回撥函式 ,沒有引數 ;

以下是結合以上幾個API寫成的綜合的程式:

/**
 * fs.read(fd,buffer,offset,length,position,callback);
 * 注意:該方法使用了檔案描述符來讀取檔案;
 * 
 * 引數:
 * fd------------通過fs.open()方法返回的檔案描述符;
 * buffer--------資料寫入的緩衝區;
 * offset--------緩衝區寫入的寫入偏移量;
 * length--------要從檔案讀取的位元組數;
 * position------檔案讀取的起始位置,如果position的值為null,則會
 *               當前檔案指標的位置讀取;
 * callback------回撥函式,有三個引數error,bytesRead,buffer,
 *              (1):error為錯誤資訊;
 *              (2):byteRead表示從緩衝區buffer中讀取的位元組數;
 *              (3):buffer為緩衝區物件;
 * 
 */

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

console.log('準備開啟檔案!');
fs.open('input.txt','r+',function(error,fd){
    if(error){
        console.log(error);
    }
    console.log('檔案開啟成功!');
    console.log('準備讀取檔案');
    console.log(buf.length);//列印的結束應該是input.txt檔案中的位元組數,就是說要讀取所有檔案;
    fs.read(fd,buf,0,buf.length,0,function(error,bytesRead,buffer){
        if(error){
            console.log(error);
        }
        console.log('讀取資料的位元組數如下:'+bytesRead.toString());
        //僅輸出讀取的位元組
        if(bytesRead>0){
            console.log(buf.slice(0,bytesRead).toString());
        }
        //console.log(buffer.toString());
    });
    fs.close(fd,function(error){
        if(error){
            console.log(error);
        }
        console.log('檔案關閉成功 !');
    });
});

//console.log('程式結束!');