iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 8
1

今天,來到了賽程第八天。
小編分身無數,一邊鐵人賽;一邊在自己的blog,補上所學筆記,一邊學新東西。
昨天,小編才做好關於 cookie 的筆記,就累到翻了。
現在,己經下午了,趕緊來po文吧!
今天講的部份是檔案系統,學會的話,可以使用node.js進行文件的 聽(?) 說(?) 讀 寫...
前言真是... 趕快來看看吧!

Node.js 的 fs module ,是用來操作實體檔案,可以同步或非同步存取檔案系統操作。
一般建議使用 非同步存取 檔案,性能高、速度快、無阻塞。

非同步讀取檔案

我們用
fs.readFile(fileName [,options], callback)
可以讀取檔案。

參數:

  • fileName: 檔案的完整路徑及檔名,格式字串。
  • options: options 可能是一個物件或字串,包含"編碼"及"flag"。這裡預設的編碼是 utf8 , flag是 “r"。
  • call back: 是帶兩個參數的function,err及file data,當我們執行readFile完成時, 要做的事, 例如: 回傳file data。

不多說,讓我們來看看例子:
首先,我們先任意建立一個TestFile.txt檔案,內容如下:

TestFile.txt

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

讀取TestFile.txt檔案

rdTestFile.js

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

同步讀取檔案

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

rdfss.js

var fs = require('fs'); 
var 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。

新增並寫入檔案範例

wrFile.js

var 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()

apFile.js

var 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

var 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

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

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

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

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

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


上一篇
Day7 - Node.js 內建的 Web Server 介紹及使用
下一篇
Day9 - node.js 內建除錯
系列文
Node.JS - 30 天入門學習筆記32

2 則留言

0
小財神
iT邦好手 1 級 ‧ 2016-12-08 16:36:13

堅持下去!(握)

0
boltnut
iT邦新手 5 級 ‧ 2019-05-12 00:00:51

小弟嘗試用 fs.writeFile 將 '今天天氣很好!' 字串寫入
test.txt 檔,結果得到有名的 UTF-8字符'EF BF BD' 錯誤。
請大大指點一下。https://ithelp.ithome.com.tw/upload/images/20190512/200875857oeNIAD0nV.jpg

boltnut iT邦新手 5 級‧ 2019-05-12 09:25:38 檢舉

我要留言

立即登入留言