在Node.js中操作檔案系統(一)

龍恩0707發表於2015-05-02

在Node.js中操作檔案系統

     在Node.js中,使用fs模組來實現所有有關檔案及目錄的建立,寫入及刪除操作。在fs模組中,所有對檔案及目錄的操作都可以使用同步與非同步這兩種方法。比如在執行讀檔案操作時,可以使用readFile與readFileSync方法。在所有這些方法中,方法名中具有Sync字尾的方法均為同步方法,而不具有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);
})
Console.log(1);// 這句程式碼先執行

但是非同步的方法是不能保證順序執行的。比如如下

fs.readFile(‘./index.html’,’utf8’,function(err,data){
    console.log(data);
})

fs.readFile(‘./index2.html’,’utf8’,function(err,data){
    console.log(data);
})

上面2個非同步方法,我們不能保證那個非同步方法先執行完,如果我們先要第一個方法執行完後,在執行第二個方法,那麼程式碼需要如下寫了:

fs.readFile(‘./index.html’,’utf8’,function(err,data){
    console.log(data);
    fs.readFile(‘./index2.html’,’utf8’,function(err,data){
         console.log(data);
    })

})

我們先來看看檔案的讀寫操作;如下:

一:檔案的讀操作;

讀取檔案的方法可以使用fs模組中的readFile與readFileSync方法,我們先來了解readFile方法;如下:

  fs.readFile(filename,[options],callback);

在readFile方法中,有三個引數,其中filename引數與callback引數是必須的,options引數是可選的,filename引數用於指定讀取檔案的完整檔案路徑及檔名。Options引數值為一個物件,在其中指定讀取檔案時需要使用的選項,在該引數值物件中可以使用flag屬性指定對該檔案採取什麼操作,預設值為 ’r’(如果指定讀取的檔案不存在,則丟擲異常)。可以指定的值如下:

'r’: 讀取檔案,如果檔案不存在則丟擲異常。

‘r+’: 讀取並寫入檔案,如果檔案不存在則丟擲異常。

‘w’:  寫入檔案。如果檔案不存在則建立該檔案,如果該檔案已存在則清空檔案內容。

 ‘wx’: 作用與’w’類似。

‘w+’ 讀取並寫入檔案。如果檔案不存在則建立該檔案,如果該檔案已存在則清空檔案內容。

‘wx+’ 作用與’w+’類似。

‘a’ 追加寫入檔案,如果該檔案不存在則建立該檔案。

‘ax’ 作用與’a’類似。

‘a+’ 讀取並追加寫入檔案,如果檔案不存在則建立該檔案。

 ‘ax+’ 作用與’a+’類似。

在options引數值中,可使用encoding屬性指定使用何種編碼格式來讀取該檔案,可指定屬性值為’utf8’,’ascii’與’base64’. Callback引數用於檔案讀取完畢執行的回撥函式。比如下面的方法:

Function(err,data){}

其中第一個引數值為讀取檔案操作失敗時候觸發的錯誤物件,第二個引數值為讀取到的檔案內容。  當在options引數值物件中使用encoding屬性指定編碼格式時,該引數值為將檔案內容指定編碼格式經過編碼後的字串,當不指定編碼格式時,該引數值為一個存放了檔案中原始二進位制內容的快取區物件。

我們可以先來看一個簡單的readFile方法的使用demo,比如在我的根目錄下放一個test.txt檔案,內容如下:

這是第一行

這是第二行

然後在應用程式的根目錄下放一個app.js檔案,程式碼如下:

var fs = require('fs');

fs.readFile('./test.txt',function(err,data){
    if(err) {
        console.log("讀取檔案時發生錯誤");
    }else {
        console.log(data);
    }
});

我們讀取test.txt檔案中的內容,如果讀取成功,則在控制檯將其輸出,如果讀取失敗,則在控制檯中輸出 ”讀取檔案時發生錯誤”.

注意:test.txt檔案需要儲存編碼為utf-8

如下所示:

由上可知:控制檯輸出的是存取了檔案原始二進位制資料的快取區中的內容,如果要將該內容以字串的形式輸出,有2種方式如下:

程式碼改為如下1:

var fs = require('fs');
fs.readFile('./test.txt',function(err,data){
    if(err) {
        console.log("讀取檔案時發生錯誤");
    }else {
        console.log(data.toString());
    }
});

第二種形式是:我們可以指定options引數並將encoding屬性值指定為某種編碼格式,則回撥函式中的第二個引數值返回將檔案內容根據指定編碼格式進行編碼後的字串。如下程式碼:

var fs = require('fs');
fs.readFile('./test.txt','utf8',function(err,data){
    if(err) {
        console.log("讀取檔案時發生錯誤");
    }else {
        console.log(data);
    }
});

執行如下:

在使用同步方式讀取檔案時,使用readFileSync方法,該方法使用如下:

var data = fs.readFileSync(filename,[options]);

在readFileSync方法中,使用兩個引數,這兩個引數的含義及指定方法與readFile方法中使用filename引數與options 引數的含義及指定方法完全相同。

如下程式碼:

var fs = require('fs');
try{
    var data = fs.readFileSync('./test.txt','utf8');
    console.log(data);
}catch(e){
    console.log("讀取檔案時發生錯誤。");
}

執行效果如上所示:

二:檔案的寫操作;

在完整寫入一個檔案時,我們可以使用fs模組的writeFile方法或writeFileSync方法。使用方法如下所示:

fs.writeFile(filename,data,[options],callback);

     在writeFile方法中,使用4個引數,其中filename,data,callback為必須指定的引數,[options]為可選引數,filename引數用於指定需要被寫入檔案的完整檔案路徑及檔名,data引數用於指定需要寫入的內容,引數值可以為一個字串或一個buffer物件,該字串或快取區中的內容將被完整地寫入到檔案中。Options引數值為一個物件,在其中指定寫入檔案時需要使用的選項,在該引數值物件中可以使用如下所示的屬性值。

1. flag屬性:用於指定對該檔案採取何種操作,預設值’w’(檔案不存在時建立該檔案,檔案已存在時重寫該檔案,)可指定值及其含義與readFile方法中使用的options引數值中的flag屬性的可指定值及其含義相同。

2. mode屬性:用於指定當檔案被開啟時對該檔案的讀寫許可權,預設值為0666(可讀寫)。該屬性值及fs模組中的各方法中的mode引數值的指定方法如下所示:使用4個引數組成mode屬性值或mode引數值,其中第一個數字必須為0,第二個數字用於規定檔案或目錄所有者的許可權,第三個數字用於規定檔案或目錄所有者所屬使用者組的許可權,第四個數字規定其他人的許可權,可以設定的數字如下所示:

1. 執行許可權

2. 寫許可權

3. 讀許可權

如果需要設定讀寫等複合許可權,可以對以上三個數字進行加運算,比如使用 2+4=6來設定讀寫許可權。

下面我們來看看demo,其中app.js程式碼如下:

var fs = require('fs');
fs.writeFile('./message.txt',"這是第一行。\r\n這是第二行.",function(err){
    if(err) {
        console.log("寫檔案操作失敗");
    }else {
        console.log("寫檔案操作成功");
    }
});

在上面的程式碼中,我們將在應用程式的根目錄建立一個message.txt檔案並在其中寫入兩行文字。我們可以去看下根目錄就知道,就生成了一個message.txt檔案了。

接下來我們看一個在檔案中寫入快取區中資料的程式碼,如下程式碼:

var fs = require('fs');
var data = new Buffer("我喜愛程式設計");
fs.writeFile('./message.txt',data,function(err){
    if(err) {
        console.log("寫檔案操作失敗");
    }else {
        console.log("寫檔案操作成功");
    }
});

如上程式碼,我們可以看到在message.txt中,寫檔案操作成功,我喜愛程式設計幾個字也在message.txt中了。

接下來我們可以通過options引數中設定flag屬性值的方式修改對檔案的操作方式,比如在程式碼中,我們可以使用writeFile方法在message.txt檔案尾部追加”這是追加的資料” 文字。比如如下程式碼:

var fs = require('fs');
var options = {
    flag: 'a'
};
fs.writeFile('./message.txt','這是追加的資料。',options,function(err){
    if(err) {
        console.log("寫檔案操作失敗");
    }else {
        console.log("寫檔案操作成功");
    }
});

進入檔案的根目錄執行下 即可 可以看到,文字被新增進去了。

內容變成如下:

我喜愛程式設計這是追加的資料。

可以通過在options引數中設定encoding屬性值的方式指定在檔案中寫入資料時使用的編碼方式,比如如下我在我的根目錄下有2張不同的圖片,分別是1.gif圖片和2.gif圖片,現在我們可以先使用readFile讀取1.gif圖片後使用base64編碼,在readFile方法的回撥函式中使用writeFile方法且該方法中使用base64編碼將讀取到1.gif圖片複製到2.gif圖片上,也就是說對之前的2.gif圖片進行覆蓋。

程式碼如下:

var fs = require('fs');
fs.readFile("./1.gif",'base64',function(err,data){
    fs.writeFile('./2.gif',data.toString(),'base64',function(err){
        if(err) {
            console.log("寫檔案操作失敗");
        }else {
            console.log("寫檔案操作成功");
        }
    });
});

執行下即可,然後我們繼續檢視2.gif圖片可以看到,和1.gif圖片一樣的。

writeFileSync:

在使用同步方式寫入檔案時,使用writeFileSync方法,該方法使用如下:

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

上面的同步方法和writeSync方法中放filename引數,data引數,[options]引數的含義及指定方法完全相同。

appendFile和appendFileSync方法

在將一個字串或一個快取區中的資料追加到一個檔案底部時,我們可以使用fs模組中的appendFile和appendFileSync方法。

   fs.appendFile(filename,data,[options],callback);

在appendFile方法中,使用4個引數,其作用及指定方法與writeFile方法所使用的4個引數的作用與指定方法大致相同,區別在於,在options引數值物件中,flag屬性的預設屬性值為’a’(在檔案底部追加寫入資料,如果檔案不存在,則建立該檔案)。

如下程式碼:

var fs = require('fs');
fs.appendFile('./message.txt','這是追加的資料2。','utf8',function(err){
    if(err) {
        console.log("寫檔案操作失敗");
    }else {
        console.log("寫檔案操作成功");
    }
});

執行下即可看到資料了。如果message.txt檔案不存在,則建立該檔案。

在使用同步方式在檔案底部追加資料時,可以使用appendFileSync方法,該方法的使用方式如下:

  fs.appendFileSync(filename,data,[options]);

該方法的引數和appendFile方法的引數的含義和指定方法完全相同。

三:從指定位置處開始讀寫檔案。

open:

如何從指定位置處開始讀寫檔案的處理,我們首先需要使用fs模組中的open方法或openSync方法開啟檔案。open方法使用方式如下:

  fs.open(filename,flags,[mode],callback);

在open方法中,可以使用4個引數,其中filename,flags引數與callback引數是必須項。mode引數是可選項,filename,flags,[mode]引數的作用及其指定方法與writeFile相同。

Callback引數用於指定檔案開啟操作執行完畢時的回撥函式,如下所示:

  Function(err,id){}

其中第一引數值為開啟檔案操作失敗時所觸發的錯誤物件,第二個引數值為一個整數值,代表開啟檔案時返回的檔案描述符

如下demo

var fs = require('fs');
fs.open('./message.txt','r',function(err,id){
    console.log(id);
});

截圖如下:

openSync:

在使用同步方式開啟檔案時,使用openSync方法,如下所示:

var  fd = fs.openSync(filename,flags,[mode]); 引數與上面open引數一樣的。

在開啟檔案後,可以在回撥函式中使用fs模組中的read方法或readSync方法從檔案的指定位置處讀取檔案,也可以呼叫fs模組中的write方法或writeSync方法從檔案的指定處開始寫入資料。

read:

下面我們下來看看read方法,該方法從檔案的指定位置處讀取檔案,一直讀取到檔案底部,然後將讀取到的內容輸出到一個快取區中,該方法使用如下所示:

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

在read方法中,使用6個引數,其中fd引數值必須為open方法所使用的回撥函式中返回檔案描述符或openSync方法返回的檔案描述符; buffer引數值為一個Buffer物件,用於指定將檔案資料讀取到那個快取區中,offset引數值,length引數值與position引數值均為一個整數,其中offset引數用於指定向快取區中寫入資料時的開始寫入位置(以位元組為單位),length引數用於指定從檔案中讀取的位元組數,position引數用於指定讀取檔案時的開始位置(以位元組為單位)。Callback引數用於指定檔案讀取操作執行完畢時執行的回撥函式,如下

Function (err,bytesRead,buffer){}

Callback有3個引數,err為讀取檔案操作失敗時所觸發的錯誤物件;bytesRead為一個整數值,代表實際讀取的位元組數,buffer為被讀取的快取區的物件。

我們來看看程式碼如下,我們將使用read方法從應用程式根目錄下的內容為”我喜愛程式設計”字串的message.txt檔案中將”喜愛編”這三個字元讀取到一個快取區中,然後從快取區中讀取這三個字元並將其在控制檯輸出;如下程式碼:

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

演示如下:

其中message.txt內容如下:

我喜愛程式設計這是追加的資料。這是追加的資料2。

上面程式碼是先開啟message.txt檔案,然後offset引數用於指定向快取區中寫入資料時的開始寫入位置,為0;length=9 意思是:指定從檔案中讀取的位元組數,由於一個漢字的utf編碼為3個位元組資料,因此中文為3個。Position=3 用於指定讀取檔案時的開始位置,因此從”喜”字開始讀取。

read方法的position引數值用於指定讀取檔案時的開始位置(以位元組為單位),如果該引數為null,將從檔案的當前讀取位置處(前一次讀取時的開始位置+讀取位元組數)開始讀取檔案。如下程式碼:

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());
        // 從檔案的當前讀取位置繼續往下讀取
        fs.read(fd,buf,0,3,null,function(err,bytesRead,buffer){
            console.log(buffer.slice(0,bytesRead).toString());
        });
    });
});

演示如下:

readSync

在使用同步方式開啟檔案時,使用readSync方法,程式碼如下:

var  bytesRead = fs.readSync(fd,buffer,offset,length,position);

同步中的readSync和read方法裡面的引數完全相同,該方法返回實際從檔案中讀取到的位元組數。

下面是同步方式的程式碼如下:

var fs = require('fs');
fs.open('./message.txt','r',function(err,fd){
    var buf = new Buffer(255);
    // 一個漢字的utf編碼為三個位元組資料
    var bytesRead = fs.readSync(fd,buf,0,9,3);
    console.log(bytesRead);
    console.log(buf.slice(0,bytesRead).toString());
});

截圖如下:

write方法和writeSync方法

在開啟檔案之後,可以使用fs模組中的write方法或writeSync方法從一個快取區中讀取資料並且從檔案的指定處開始寫入資料。

write方法使用如下:

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

在write方法中,使用6個引數,fd引數值必須為open方法或者openSync方法所使用的回撥函式中返回的檔案描述符;buffer引數值為一個Buffer物件,用於指定從哪個快取區中讀取資料,offset,length及position引數值均為一個整數值,其中offset引數用於指定從快取區中讀取資料時的開始讀取位置(以位元組為單位);length引數用於指定從快取區中讀取的位元組數,position引數值用於指定寫入檔案時的開始位置(以位元組為單位)。

Callback引數用於指定檔案寫入操作執行完畢時執行的回撥函式,如下:

Function (err,written,buffer){}

該回撥使用三個引數,err引數為寫入檔案操作失敗時所觸發的錯誤物件;written引數值為一個整數值,代表被寫入的位元組數;buffer引數值為一個Buffer物件,代表被讀取的快取區物件;

下面我們來看看write方法的demo,我們將首先使用”我喜愛程式設計”字串建立一個快取區物件,然後使用write方法從快取區中讀取”喜愛編”這三個字元並將其寫入message.txt檔案中,程式碼如下:

var fs = require('fs');
var buf = new Buffer("我喜愛程式設計");
fs.open('./message.txt','w',function(err,fd){
    fs.write(fd,buf,3,9,0,function(err,written,buffer){
        if(err) {
            console.log("寫檔案操作失敗");
        }else {
            console.log("寫檔案操作成功");
        }
    });
});

執行命令後,可以開啟message.txt檔案,可以看到內容為:‘喜愛編’

Write方法的position引數值用於指定寫入檔案時的開始位置(以位元組為單位),當引數值為null時,將從檔案的當前被寫入位置處(前一次寫入時的開始位置+寫入位元組數)開始寫入檔案。

我們接著修改app.js程式碼,在將 ”喜愛編”字串寫入到應用程式根目錄的message.txt檔案中後,追加寫入”程”字串。程式碼如下

var fs = require('fs');
var buf = new Buffer("我喜愛程式設計");
fs.open('./message.txt','a',function(err,fd){
    fs.write(fd,buf,3,9,0,function(err,written,buffer){
        fs.write(fd,buf,12,3,null,function(err,written,buffer){
            if(err) {
                console.log("寫檔案操作失敗");
            }else {
                console.log("寫檔案操作成功");
            }
        });
    });
});

Message.txt內容如下:

喜愛程式設計

在使用同步方式寫入檔案時,使用writeSync方法,使用方式如下:

fs.writeSync(fd,buffer,offset,length,position);

上面的5個引數與write方法的引數完全相同。

close方法與closeSync方法

在fs模組中,提供close方法與closeSync方法以關閉檔案;

使用如下:

fs.close(fd,[callback]);

在close方法中,使用2個引數,其中fd引數值必須為open方法所使用的回撥函式中返回的檔案描述符或openSync返回的描述符,callback引數為一個可選引數,用於指定關閉檔案操作結束時執行的回撥函式,在回撥函式中使用一個引數,引數值為關閉檔案操作失敗時觸發的錯誤物件。那我們現在可以在我們的根目錄下建立a.txt檔案並在其中寫入 “我喜愛程式設計”字串,然後關閉a.txt檔案。

var fs = require('fs');
var buf = new Buffer("我喜愛程式設計");
fs.open('./a.txt','wx',function(err,fd){
    fs.write(fd,buf,0,15,0,function(err,written,buffer){
        if(err) {
            console.log("寫檔案操作失敗");
        }else {
            console.log("寫檔案操作成功");
            fs.close(fd);
        }
    });
});

執行下可以看到在根目錄下生成a.txt檔案,內容如下:

我喜愛程式設計;

同步方式的close方法的使用方式如下所示:

fs.closeSync(fd);

使用一個引數,引數值為open方法所使用的回撥函式中返回的檔案描述符或openSync方法返回的檔案描述符。

在使用write方法或writeSync方法在檔案中寫入資料時,作業系統的做法是首先將該部分資料讀到記憶體中,再把資料寫到檔案中,當資料讀完時並不代表資料已經寫完,因為還有部分資料有可能留在記憶體緩衝區中,這時如果我們呼叫close方法或closeSync方法關閉檔案,那麼這部分的資料就會丟失,這時我們可以使用fs模組中的fsync方法對檔案進行同步操作,即將記憶體緩衝區中的剩餘資料全部寫入檔案,該方法使用如下:

fs.fsync(fd,[callback]);

程式碼可以如下:

var fs = require('fs');
var buf = new Buffer("我喜愛程式設計");
fs.open('./a.txt','w',function(err,fd){
    fs.write(fd,buf,0,15,0,function(err,written,buffer){
        if(err) {
            console.log("寫檔案操作失敗");
        }else {
            console.log("寫檔案操作成功");
            fs.fsync(fd);
            fs.close(fd);
        }
    });
});

四:建立與讀取目錄

4.1 建立目錄;

在fs模組中,可以使用mkdir方法建立目錄,使用方法如下:

fs.mkdir(path,[mode],callback);

其中path引數與callback引數為必須輸入的引數,[mode]為可選引數,path引數用於指定需要被建立的目錄的完整路徑及目錄名;mode引數值用於指定該目錄的許可權,預設值為0777(表示任何人可讀寫該目錄);callback引數用於指定建立目錄操作完畢時呼叫的回撥函式,該回撥函式中使用一個引數,引數值為建立目錄操作失敗時觸發的錯誤物件。

程式碼如下:

var fs = require('fs');
fs.mkdir('./test',function(err){
    if(err) {
        console.log("建立目錄操作失敗");
    }else {
        console.log("建立目錄操作成功");
    }
});

演示如下:

我們看到在我們的目錄下 就建立了一個test目錄;

在使用同步方式建立目錄時,可以使用fs模組中的mkdirSync方法,該方法使用如下:fs.mkdirSync(path,[mode]);

上面2個引數的含義與mkdir中的path,[mode]引數的含義一樣。

4.2讀取目錄;

在fs模組中,可以使用readdir方法讀取目錄,該方法使用如下:

fs.readdir(path,callback);

在readdir方法中,使用2個引數,其中path引數用於指定需要被讀取的目錄的完整路徑及目錄名,callback引數用於指定讀取目錄操作完畢時呼叫的回撥函式,該回撥函式如下所示:

Function(err,files){};

第一個引數為讀取目錄操作失敗時觸發的錯誤的物件,第二個引數值為一個陣列,其中存放了讀取到的檔案中的所有檔名。

下面我們來演示下讀取根目錄下的所有檔案的程式碼如下:

var fs = require('fs');
fs.readdir('./',function(err,files){
    if(err){
        console.log("讀取目錄操作失敗");
    }else {
        console.log(files);
    }
});

演示如下:

在使用同步方式讀取目錄時,可以使用readdirSync方法,該方法使用如下:

var file = fs.readdirSync(path);

在readdirSync方法中,使用一個引數,用於指定需要讀取的目錄的完整路徑及目錄名,該方法返回被讀取目錄中所有檔名構成的陣列;

五:檢視與修改檔案或目錄的資訊

1. 檢查檔案或目錄是否存在。

在fs模組中,可以使用exists方法檢查一個檔案或目錄是否存在,該方法的使用方式如下所示:

fs.exists(path,callback);

在exists方法中,可以使用兩個引數,path引數用於指定需要被檢查的檔案或目錄的完整路徑及檔名或目錄名,callback引數用於指定檢查檔案或目錄資訊操作完畢時執行的回撥函式,如下:

Function(exists){}

在該回撥函式中,使用一個引數,當檔案或目錄存在時,該引數值為true,否則為false。如下程式碼所示:

var fs = require('fs');
fs.exists('./message.txt',function(exists){
    if(exists) {
        console.log("該檔案存在");
    }else {
        console.log("該檔案不存在");
    }
});

如果根目錄有message.txt檔案的話,說明檔案已存在,否則的話 不存在。

在使用同步方法檢查檔案是否存在時,可以使用fs模組中的existSync方法,該方法的使用方式如下:

var exists = fs.existsSync(path);

2. 獲取檔案或目錄的絕對路徑

在fs模組中,可以使用realpath方法獲取一個檔案或目錄的絕對路徑,該方法使用如下所示:

fs.realpath(path,[cache],callback);

path引數與callback引數為必須的,cache引數為可選的,其中path引數為需要檢視的檔案或目錄的完整路徑,cache引數值為一個物件,其中存放了一些預先指定的路徑,callback引數用於指定獲取檔案或目錄的絕對路徑操作完畢時執行的回撥函式,該回撥函式使用兩個引數,其中err引數值為獲取檔案或目錄的絕對路徑操作失敗時觸發的錯誤物件,resolvedPath引數值為獲取到的檔案或目錄的絕對路徑。

如下程式碼:

var fs = require('fs');
fs.realpath('./message.txt',function(err,resolvedPath){
    if(err) {
        console.log("獲取檔案失敗");
    }else {
        console.log(resolvedPath);
    }
});

演示如下:

在使用同步方式獲取檔案或目錄的絕對路徑時,可以使用realpathSync方法,該方法使用如下所示:

var resolvedPath = fs.realpathSync(path,[cache]);

3. 修改檔案或目錄的讀寫許可權

在fs模組中,可以使用chmod方法修改檔案或目錄的讀寫許可權,該方法使用如下所示:

fs.chmod(path,mode,callback);

在chomd方法中,可以使用三個引數,path引數用於指定需要被修改讀寫許可權的檔案的完整路徑及檔案或目錄名,mode引數用於指定修改後的檔案或目錄讀寫許可權;callback引數用於指定修改檔案讀寫許可權操作完成後執行的回撥函式,該回撥函式使用一個引數,引數值為修改檔案讀寫許可權操作失敗的觸發錯誤物件。

如下程式碼:

var fs = require('fs');
// 0600代表所有者可讀寫,其他人沒有任何許可權
fs.chmod('./message1.txt',0600,function(err){
    if(err) {
        console.log("修改檔案許可權操作失敗");
    }else {
        console.log("修改檔案許可權操作成功");
    }
});

// 0644代表所有者可讀寫,其他人只讀
fs.chmod('./message2.txt',0644,function(err){
    if(err) {
        console.log("修改檔案許可權操作失敗");
    }else {
        console.log("修改檔案許可權操作成功");
    }
});

// 0755代表所有者所有許可權,其他所有人可讀和執行
fs.chmod('./message3.txt',0755,function(err){
    if(err) {
        console.log("修改檔案許可權操作失敗");
    }else {
        console.log("修改檔案許可權操作成功");
    }
});

// 0740代表所有者所有許可權,所有者所在的組只讀
fs.chmod('./message4.txt',0740,function(err){
    if(err) {
        console.log("修改檔案許可權操作失敗");
    }else {
        console.log("修改檔案許可權操作成功");
    }
});

在使用同步方式修改檔案或目錄的讀寫許可權時,可以使用fs模組中的chmodSync方法,使用方法如下:

fs.chmodSync(path,mode);

相關文章