Skip to main content

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檔案

rdTestFile.js

readFile
var fs = require('fs');

fs.readFile('TestFile.txt', function (err, data) {
if (err) throw err;

console.log(data.toString());
});

如上,我們執行完讀取檔案操作,它會執行 function,如果有錯誤,會回傳錯誤;成功,會回傳所讀取的檔案資料。如圖:

http://ithelp.ithome.com.tw/upload/images/20161208/20103526w1kwgD510P.png

同步讀取檔案

雖然,常用的是非同步讀取檔案,但,我們也可以看看,如何同步讀取檔案。

readFileSync
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。

新增並寫入檔案範例

writeFile
const fs = require('fs');

fs.writeFile('test.txt', '您好嗎?', function (err) {
if (err)
console.log(err);
else
console.log('Write operation complete.');
});

這裡例子裡,我們新增了原本不存在的 test.txt檔案,並且寫入 “您好嗎?"。如果成功會輸出操作成功的訊息。如圖: http://ithelp.ithome.com.tw/upload/images/20161208/2010352696ZbxRrCrV.png

我們可以看到資料夾裡,新增了test.txt檔案,打開來看內容,確實被寫入了!

新增內容至檔案

如果,我們要新增內容至檔案(不覆蓋),該如何做呢?同樣方式,同樣的參數,我們可以用fs.appendFile()

appendFile
const fs = require('fs');

fs.appendFile('test.txt', '我很好!', function (err) {
if (err)
console.log(err);
else
console.log('Append operation complete.');
});

我們執行,並且打開檔案看看,如圖: http://ithelp.ithome.com.tw/upload/images/20161208/20103526NfvQRk0OrI.png


開啟檔案

另外,我們也可以開啟檔案,進行讀/寫操作。

我們用 fs.open(path, flags[, mode], callback) 開啟檔案。

參數:

  • path: 檔案的完整路徑及檔名,格式字串。
  • flag: 用flag代表操作行為。可以參考下圖!
  • mode: mode代表文件的權限,預設為0666代表可讀可寫。
  • call back: 是帶兩個參數的function,err及file data,當我們執行open完成時, 要做的事, 例如: 打開成功的訊息顯示;失敗時,丟出err。

我們看看例子: opfile.js

open
const fs = require('fs');

fs.open('TestFile.txt', 'r+', function (err,fd) {
if (err) throw err;
console.log('檔案開啟成功!');
});

執行結果,如圖:

http://ithelp.ithome.com.tw/upload/images/20161208/201035262aDsP9lLNn.png

flag: http://ithelp.ithome.com.tw/upload/images/20161208/20103526PhGYXUOdyO.png

開啟讀取檔案

而與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 為緩衝區對象。

我們來看看例子:

orfile.js

open
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。

我們執行上方的程式,結果如圖:

http://ithelp.ithome.com.tw/upload/images/20161208/20103526vrpFr5JkcA.png

刪除文件

我們可以用 fs.unlink(path, callback); 刪除存在的文件。

參數: path: 檔案路徑。 callback: 只帶一個錯誤參數err的function,當我們執行unlink完成時, 要做的事。例如: 刪除成功的訊息顯示;失敗時,丟出err。

讓我們刪除剛才所建立的 TestFile.txt 檔案。

delfile.js

unlink
var fs = require('fs');

fs.unlink('test.txt', function () {
console.log('已經刪除檔案!');
});

http://ithelp.ithome.com.tw/upload/images/20161208/201035260FkDqyhzS5.png

其他,針對檔案系統操作,還有一些常用的

MethodDescription
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

參考文章

https://ithelp.ithome.com.tw/articles/10185422