node 的檔案系統
Node.js 的 fs module ,是用來操作實體檔案,可以同步或非同步存取檔案系統操作。 一般建議使用 非同步存取 檔案,性能高、速度快、無阻塞。
非同步讀取檔案
我們用
fs.readFile(fileName [,options], callback)
可以讀取檔案。
參數:
- fileName: 檔案的完整路徑及檔名,格式字串。
- options: options 可能是一個物件或字串,包含
編碼及flag。這裡預設的編碼是utf8, flag是r。 - call back: 是帶兩個參數的function,error及file data,當我們執行readFile完成時, 要做的事, 例如: 回傳file data。
讀取TestFile.txt檔案
var fs = require('fs');
fs.readFile('TestFile.txt', function (err, data) {
if (err) throw err;
console.log(data.toString());
});
如上,我們執行完讀取檔案操作,它會執行 function,如果有錯誤,會回傳錯誤;成功,會回傳所讀取的檔案資料。如圖:

同步讀取檔案
雖然,常用的是非同步讀取檔案,但,我們也可以看看,如何同步讀取檔案。
const fs = require('fs');
const data = fs.readFileSync('dummyfile.txt', 'utf8');
console.log(data);
寫入檔案
fs.writeFile() 寫入檔案,如果檔案存在,會覆寫原本檔案資料;否則會自動新增檔案並寫入資料。
我們用
fs.writeFile(filename, data[, options], callback)
可以寫入檔案。
參數: ● fileName: 檔案的完整路徑及檔名,格式字串。 ● data: 要寫入的檔案內容。 ● options: options 可能是一個物件或字串,包含"編碼"及"flag"。這裡預設的編碼是 utf8 , flag是 “w"。 ● call back: 只帶一個錯誤參數err的function,當我們執行writeFile完成時, 要做的事。例如: 寫入成功的訊息顯示;失敗時,丟出err。
新增並寫入檔案範例
const fs = require('fs');
fs.writeFile('test.txt', '您好嗎?', function (err) {
if (err)
console.log(err);
else
console.log('Write operation complete.');
});
這裡例子裡,我們新增了原本不存在的 test.txt檔案,並且寫入 “您好嗎?"。如果成功會輸出操作成功的訊息。如圖:

我們可以看到資 料夾裡,新增了test.txt檔案,打開來看內容,確實被寫入了!
新增內容至檔案
如果,我們要新增內容至檔案(不覆蓋),該如何做呢?同樣方式,同樣的參數,我們可以用fs.appendFile()
const fs = require('fs');
fs.appendFile('test.txt', '我很好!', function (err) {
if (err)
console.log(err);
else
console.log('Append operation complete.');
});
我們執行,並且打開檔案看看,如圖:

開啟檔案
另外,我們也可以開啟檔案,進行讀/寫操作。
我們用
fs.open(path, flags[, mode], callback)
開啟檔案。
參數:
- path: 檔案的完整路徑及檔名,格式字串。
- flag: 用flag代表操作行為。可以參考下圖!
- mode: mode代表文件的權限,預設為0666代表可讀可寫。
- call back: 是帶兩個參數的function,err及file data,當我們執行open完成時, 要做的事, 例如: 打開成功的訊息顯示;失敗時,丟出err。
我們看看例子: opfile.js
const fs = require('fs');
fs.open('TestFile.txt', 'r+', function (err,fd) {
if (err) throw err;
console.log('檔案開啟成功!');
});
執行結果,如圖:

flag:

開啟讀取檔案
而與fs.open有關的,即我們要在open操作時,也讀取文件時,該怎麼做呢? 我們可以在fs.open時,執行 fs.read()。
我們用 fs.read(fd, buffer, offset, length, position, callback) 讀取open檔案。
參數:
- fd: 透過 fs.open() 方法返回的文件描述符。
- buffer: 數據寫入的緩衝區。
- offset: 緩衝區寫入的寫入偏移量。
- length: 要從文件中讀取的字元數。
- position: 文件讀取的起始位置,如果 position 的值為null,則會從當前文件游標的位置讀取。
- callback: 回呼函式,有三個參數err, bytesRead, buffer。 err 為錯誤訊息, bytesRead 表示讀取的字元數,buffer 為緩衝區對象。
我們來看看例子:
var fs = require('fs');
fs.open('TestFile.txt', 'r', function (err, fd) {
if (err) {
return console.error(err);
}
var buffr = new Buffer(1024);
fs.read(fd, buffr, 0, buffr.length, 0, function (err, bytes) {
if (err) throw err;
// Print only read bytes to avoid junk.
if (bytes > 0) {
console.log(bytes+" 字元被讀取");
console.log(buffr.slice(0, bytes).toString());
}
// Close the opened file.
fs.close(fd, function (err) {
if (err) throw err;
});
});
});
從這個例子裡,我們做了fs.open(), fs.read(), 那麼, 我們也看到了 fs.close() 關閉檔案的使用方法。 fs.close(fd, callback)
其中,參數: ● fd: 透過 fs.open() 方法返回的文件描述符。 ● call back: 只帶一個錯誤參數err的function,當我們執行close完成時, 要做的事。例如: 失敗時,丟出err。
我們執行上方的程式,結果如圖:

刪除文件
我們可以用
fs.unlink(path, callback);
刪除存在的文件。
參數: path: 檔案路徑。 callback: 只帶一個錯誤參數err的function,當我們執行unlink完成時, 要做的事。例如: 刪除成功的訊息顯示;失敗時,丟出err。
讓我們刪除剛才所建立的 TestFile.txt 檔案。
var fs = require('fs');
fs.unlink('test.txt', function () {
console.log('已經刪除檔案!');
});

其他,針對檔案系統操作,還有一些常用的
| Method | Description |
|---|---|
| fs.readFile(fileName [,options], callback) | 讀取現有文件。 |
| fs.writeFile(filename, data[, options], callback) | 寫入文件。如果存在則覆蓋,否則建立一個新的文件。 |
| fs.open(path, flags[, mode], callback) | 打開文件進行閱讀或寫入。 |
| fs.rename(oldPath, newPath, callback) | 重命名現有文件。 |
| fs.stat(path, callback) | 返回包含重要文件統計信息的fs.stat 物件。 |
| fs.rmdir(path, callback) | 重命名現有目錄。 |
| fs.mkdir(path[, mode], callback) | 創建新目錄。 |
| fs.readdir(path, callback) | 讀取指定目錄的內容。 |
| fs.utimes(path, atime, mtime, callback) | 更改文件的時間標記。 |
| fs.exists(path, callback) | 確定指定的文件是否存在。 |
| fs.access(path[, mode], callback) | 測試指定文件的用戶權限。 |
| fs.appendFile(file, data[, options], callback) | 將新內容附加到現有文件。 |
也可以上去官網看相關文件: fs module