嗨,大家好我是 Robin,今天來分享 Node 中的檔案系統(fs),
想必各位讀者對於開檔讀檔也是略知一二啊,不過我可是...
什麼都不會啊! xDD
如果你跟我一樣,恭喜你可以跟我一同學習。
如果你會了,也可以看文章中是否跟你想的有出入或是有額外的新知。
這篇一樣會講幾個核心的用法剩下你們想要做什麼壞壞的事再研究,或是跟我一起討論我們一起壞 xDD
顧名思義就是操作作業系統上操作檔案所需的所有功能,
然後 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 的你~
有問題可以底下留言~