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('程式結束!');