重拾nodejs之文件操作

好久沒看node了,一年前雄心壯志要學一門後臺語言,折騰了PHP和nodejs但由於種種原因並沒有堅持下來,學的東西也零零散散,並沒有做系統的整理,前兩天由於公司業務需要用到node,所以就又溫習了一遍文件操作部分,不算熟悉不算陌生,問題解決了,也重新激起了心底對node的喜愛,因爲它真的很強大,java/PHP等服務器端語言中,爲每一個客戶端連接創建一個新的線程,每個線程需要耗費大約2MB的內存,理論上來說具有8GB內存的服務器可以同時連接的最大用戶數只有4000個左右,而nodejs修改了客戶端到服務器端的連接方法,它並不爲每個客戶端連接創建一個新的線程,而是爲每個客戶端連接觸發一個在nodejs內部進行處理的事件,因此它可以同時處理多達幾萬個用戶的客戶端連接。這麼強大的nodejs,對前端開發者來說語法又相對友好,想朝全棧發展的front-end engineer nodejs一定是首選。回到正題,總結一下這兩天覆習的文件操作。

nodejs中使用fs模塊來實現所有有關文件及目錄的創建,寫入及刪除操作。

1. 同步方法與異步方法

在fs模塊中,所有對文件及目錄的操作都可以使用同步與異步這兩種方法。

(1)區別:

  • 同步方法(有Sync後綴)立即返回操作結果,在使用同步方法執行的操作結束之前,不能執行後續代碼。
  • 使用場景:讀取配置文件並啓動服務器
var fs = require('fs');
var data = fs.readFileSync('./index.html','utf8');
//等待操作返回結果,然後利用該結果
console.log(data);
  • 異步方法將操作結果作爲回調函數的參數進行返回,在方法調用之後,可以立即執行後續代碼。在大多數情況下,都使用異步方法。
var fs = require('fs');
fs.readFile('./index.html','utf8',function(err,data) {
//操作結果作爲回調函數的第二個參數返回
console.log(data);
});

同時調用多個異步方法時,並不能確保操作結果的返回順序。如果需要確保在一個文件讀取完畢後再讀取另一個文件,方法如下:

var fs = require('fs');
fs.readFile('./file.html',function(err,data) {
    //在回調函數中讀取另一個文件
    fs.readFile('./other.html',function(err,data) {
    //回調函數代碼略
    });
});

2.對文件執行讀寫操作

(1)讀文件

fs.readFile(filename,[options],callback)
  • filename參數:用於指定讀取文件的完整文件路徑及文件名參數;
  • options參數:爲可選參數,值爲一個對象;
    • flag屬性:指定對該文件採取什麼操作,默認值爲’r’;
    • encoding屬性:指定使用何種編碼方式來讀取該文件,可指定屬性值爲’utf8’,’ascii’與’base64’;
  • callback參數:用於文件讀取完畢時執行的回調函數。
 function(err,data) {
 //回調函數代碼略
 }

例1:使用readFile方法讀取文件

var fs = require('fs');
fs.readFile('.test.txt','utf8',function(err,data) {
    if(err) console.log('an error occurred while reading the file');
    //output file contents in console
    else console.log(data);
});

例2:使用同步方法讀取文件

var fs = require('fs');
try{
    var data=fs.readFileSync('./test.txt','utf8');
    //output file contents in console
    console.log(data);
}
catch(ex) {
    console.log('an error occurred while reading file');
}

(2)寫文件

fs.writeFile(filename,data,[options],callback)
  • filename參數:用於指定需要被寫入文件的完整文件路徑及文件名;
  • data參數:用於指定需要寫入的內容;
  • options參數:指定寫入文件時需要使用的選項
    • flag屬性:用於指定對該文件採取何種操作,默認值爲’w’;
    • mode屬性:用於指定當文件被打開時對文件的讀寫權限,默認值爲0666。由4位數字組成,第一位必須是0,第二位規定文件或目錄所有者的權限,第三位規定文件或目錄所有者所屬用戶組的權限,第四位規定其他人的權限。
      • 1:執行權限
      • 2:寫權限
      • 4:讀權限
    • encoding屬性:指定使用何種編碼格式來寫入該文件。
  • callback參數:用於文件執行完畢時執行的回調函數。
    例3:使用writeFile方法完整寫入文件
var fs = require('fs');
var data = new Buffer('i love programming');
fs.writeFile('./message.txt',data,function(err) {
    if(err) console.log('fail to write file operation');
    else console.log('successful write file operation');
});

例4:使用writeFile方法追加數據

var fs = require('fs');
var options={
    flag:'a'
}
fs.writeFile('./message.txt','additionalData',options,function(err) {
    if(err) console.log('fail to write file operation');
    else console.log('successful write file operation');
});

例5:使用writeFile方法複製圖片文件

var fs = require('fs');
fs.readFile('./a.gif','base64',function(err) {
fs.writeFile('./b.gif',data.toString(),'base64',function(err) {
    if(err) console.log('fail to write file operation');
    else console.log('successful write file operation');
});
});

例6:使用同步方式寫入文件

fs.writeFileSync(filename,data,[options])

例7:使用appendFile方法將一個字符串或一個緩衝區中的數據追加到一個文件底部

var fs = require('fs');
fs.appendFile('./message.txt','additionalData','utf8',function(err) {
    if(err) console.log('append file operation failed');
    else console.log('append file operation successed');
});

(3)從指定位置處開始讀文件

fs.open(filename,flags,[mode],callback)
var fs = require('fs');
fs.open('./message.txt','r',function(err,fd) {
    console.log(fd);
});

使用同步方式打開文件時,使用openSync方法

var fd = fs.openSync(filename,flags,[mode])
fs.read(fd,buffer,offset,length,positon,callback)
function (err,bytesRead,buffer) {
    //回調函數代碼略
});

例7:read方法使用實例

var fs = require('fs');
fs.open('./message.txt','r',function(err,fd) {
    var buf=new Buffer(255);
    //一個漢字的utf編碼爲三個字節數據
    fs.read(fd,buf,0,9,3,function(err,bytesRead,buffer) {
        console.log(buffer.slice(0,bytesRead).toString());
    });
});

(4)從指定位置處開始寫文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章