iT邦幫忙

1

【我可以你也可以的Node.js】第十三篇 - Node's file system - 非串流方式讀寫檔案

嗨,大家好我是 Robin,今天來分享 Node 中的檔案系統(fs),
想必各位讀者對於開檔讀檔也是略知一二啊,不過我可是...

什麼都不會啊! xDD
如果你跟我一樣,恭喜你可以跟我一同學習。
如果你會了,也可以看文章中是否跟你想的有出入或是有額外的新知。
這篇一樣會講幾個核心的用法剩下你們想要做什麼壞壞的事再研究,或是跟我一起討論我們一起壞 xDD


此篇學習目標 ◑ω◐ :

  • 簡介 File System
  • 使用非串流的方式讀寫檔案
  • 存取檔案狀態資料
  • 檔案異動監聽器

簡介 File System

顧名思義就是操作作業系統上操作檔案所需的所有功能,
然後 fs 模組有提供同步版本以及非同步版本,這邊不談論同步好還是非同步好,讀者都可以自由選擇。

差別在哪?
同步會在錯誤發生時直接噴錯~
非同步會以優先的 callback 作為最後一個參數。
此篇會以非同步串流的方式介紹。
之後有機會,會額外介紹檔案串流的部分。

我在研究這檔案系統時發現我真的是見的世面很淺,
也從沒想過原來一個語言的檔案系統可以跨平台的原因。
都是 煙捲 搞的鬼。

Node 中的 file system 可以跨平台是因為是一組 POXIS 函式的包裝,
aka 可移植作業系統介面
總而言之他就是一個統一介面,
使得他可以讓 Node 的 file system 支援多個作業系統上的運作,
例如 Linux , OS X, Windows , 樹莓派, Android ... 等等作業系統環境。

使用非串流的方式讀寫檔案

讀檔

先看一下官方文件,看一下使用方式~

fs.readFile(path[, options], callback)

先建立一個 readme.txt 檔案
內容如下

I'm Robin

寫一個名為 fsRead.js 的檔案

const fs = require('fs')

fs.readFile('readme.txt', (err, data) => {
    if (err) return console.error(err);
    console.log(data)
});

執行結果...

他會回傳一個 Buffer 物件,只要加上 .toString()
就可以如預期顯示你要的文字囉

const fs = require('fs')

fs.readFile('writeme.txt', (err, data) => {
    if (err) return console.error(err);
    console.log(data.toString())
});

寫檔

一樣參考官方文件用法

fs.writeFile(file, data[, options], callback)

寫一個名為 fsWrite.js 的檔案,
寫完之後使用上面讀檔的方式印出寫入好的資料。

const fs = require('fs')

fs.writeFile('./writeme.txt', '鼠年全馬 gogogo', (err) => {
    if (err) return console.error(err);
    fs.readFile('writeme.txt', (err, data) => {
        if (err) return console.error(err);
        console.log(data.toString())
    });
});

執行結果

然後如果目錄中沒有該檔案他也會幫你建立並寫入。

存取檔案狀態資料

在 Node 中我們可以使用 fs.stat(), fs.lstat(), fs.fstat() 來回傳 fs.Stats 物件,來幫助你檢查檔案是否存在或是該檔案的詳細資訊。
一樣參照官方文件

fs.stat(path[, options], callback)
const fs = require('fs')
fs.stat('./readme.txt', function(err, stats) {
    if (err) return console.error(err)
    console.log(stats)
})

執行結果。

裡面有一個東西很特別是 mode,是關於檔案的權限,
問題是看不懂啊!XDD
可以搭配輔助函式 stat-mode

const fs = require('fs')
const Mode = require('stat-mode');

fs.stat('./readme.txt', function(err, stats) {
    if (err) return console.error(err)
    const mode = new Mode(stats)
    console.log(mode.toString())
    console.log(`Group execute ${mode.group.execute}`)
    console.log(`Others write ${mode.others.write}`)
    console.log(`Owner read ${mode.owner.read}`)
})

這樣就可以用比較人道的方式看這些資訊了xDD

檔案異動監聽器

不知道為什麼每次看到監聽器都有一種莫名的興奮感xD
可以做一些壞壞的事的感覺。

這部分簡單來說就是...

你做什麼我都知道哦!

書上說 fs.FSWatcher據開發者所示,在跨平台不一致且不實用。
但是有一個第三方的模組每個月有兩百萬次的下載量,好像很猛很厲害
那就是 chokidar
這邊不多作介紹,我覺得主要是知道說官方的用法在跨平台上有問題就好。
這邊還是講一下官方的 fs.watcher 和使用方法。
建立一個檔案 watchme ,內容為空也沒關係。
因為我們等等就要監聽他~

建立一個js fsWatcher.js

const fs = require('fs')

fs.watchFile('watchme.txt', (curr, prev) => {
    console.log(`the current mtime is: ${curr.mtime}`);
    console.log(`the previous mtime was: ${prev.mtime}`);
});

執行之後 開始改動watchme.txt,可以看到他是如何運作的~

此篇到此。
希望有幫助到想初步了解 node file system 的你~
有問題可以底下留言~


尚未有邦友留言

立即登入留言