極簡 Node.js 入門 - 3.1 File System API 風格
阿新 • • 發佈:2020-08-14
> 極簡 Node.js 入門系列教程:[https://www.yuque.com/sunluyong/node](https://www.yuque.com/sunluyong/node)
>
> 本文更佳閱讀體驗:[https://www.yuque.com/sunluyong/node/fs-api-style](https://www.yuque.com/sunluyong/node/fs-api-style)
Node.js 對檔案、資料夾讀寫操作主要靠內建的 fs 模組
```javascript
const fs = require('fs');
```
fs 模組提供了幾種不同調用風格的 API 支援檔案讀寫,fs.stat 方法可以獲取檔案的基本資訊,下面示例展示了不同風格 API 呼叫 fs.stat 方法
## callback 風格
Node.js 預設的非同步操作是 callback 風格 `callback(err, returnValue)`
1. err: 如果程式處理出現異常,錯誤資訊放在回撥函式的第一個引數,如果沒有錯誤 err 為 null
1. returnValue:程式正常處理完成後結果放在回撥函式第二個引數
```javascript
const fs = require('fs');
fs.stat('.', (err, stats) => {
if(err) {
// 處理錯誤。
} else {
// 使用 stats
}
});
```
## fs promise API
fs.promises API 提供了一組和 callback 風格對應的方法,返回 Promise 物件而不使用回撥,避免出現 callback 巢狀的回撥地獄問題
API 可通過 `require('fs').promises` 或 `require('fs/promises')`訪問 > require('fs/promises') v14 後可用 ```javascript const fs = require('fs').promises; // const fs = require('fs/promises'); fs.stat('.').then(stats => { // 使用 stats }).catch(error => { // 處理錯誤 }); ``` ## promisify Node.js 使用回撥風格一方面是因為效能原因,一方面是因為 Node.js 誕生的時候 Promise 規範還沒有制定,在 Promise 規範制定後 Node.js 通過內建模組 util 提供的 `promisify` 方法可以把所有標準 callback 風格方法轉成 promise 風格方法 ```javascript const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.').then(stats => {
// 使用 stats
}).catch(error => {
// 處理錯誤
});
```
## 同步方法
很多時候需要讀寫檔案後才能進行某些操作,在沒有效能問題的場景可以使用 fs 提供的同步函式來降低程式碼複雜度
fs 為大部分方法提供了一個同步版本,命名規則是方法名稱後面新增 `Sync` ,比如 fs.readFile 和 fs.readFileSync,stat 方法也有對應的同步版本 ```javascript const fs = require('fs'); try { const stats = fs.statSync('.'); // 使用 stats } catch(error) { // 處理錯誤 } ``` ## stat 上面例子簡單使用過 fs.stat 方法獲取檔案基本資訊,如果列印 stats 物件可以得到檔案基本屬性 ``` Stats { dev: 16777220, mode: 16877, nlink: 3, uid: 501, gid: 20, rdev: 0, blksize: 4096, ino: 4301278483, size: 96, blocks: 0, atimeMs: 1588483554315.173, mtimeMs: 1588483370684.5703, ctimeMs: 1588483370684.5703, birthtimeMs: 1588483342193.8625, atime: 2020-05-03T05:25:54.315Z, mtime: 2020-05-03T05:22:50.685Z, ctime: 2020-05-03T05:22:50.685Z, birthtime: 2020-05-03T05:22:22.194Z } ``` stats 物件還提供了幾個非常有用的屬性、方法獲取檔案的更多資訊,比較常用的有 1. stats.isDirectory():判斷檔案是否是個資料夾 1. stats.isFile():判斷檔案是否是普通檔案 1. stats.isSymbolicLink():判斷檔案是否是軟連結 1. stats.size:獲取檔案位元組數 ```javascript const fs = require('fs'); fs.stat('.', (err, stats) => {
if(!err) {
console.log(stats);
console.log(stats.isFile());
console.log(stats.size);
}
});
```
API 可通過 `require('fs').promises` 或 `require('fs/promises')`訪問 > require('fs/promises') v14 後可用 ```javascript const fs = require('fs').promises; // const fs = require('fs/promises'); fs.stat('.').then(stats => { // 使用 stats }).catch(error => { // 處理錯誤 }); ``` ## promisify Node.js 使用回撥風格一方面是因為效能原因,一方面是因為 Node.js 誕生的時候 Promise 規範還沒有制定,在 Promise 規範制定後 Node.js 通過內建模組 util 提供的 `promisify` 方法可以把所有標準 callback 風格方法轉成 promise 風格方法 ```javascript const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.').then(stats =>
fs 為大部分方法提供了一個同步版本,命名規則是方法名稱後面新增 `Sync` ,比如 fs.readFile 和 fs.readFileSync,stat 方法也有對應的同步版本 ```javascript const fs = require('fs'); try { const stats = fs.statSync('.'); // 使用 stats } catch(error) { // 處理錯誤 } ``` ## stat 上面例子簡單使用過 fs.stat 方法獲取檔案基本資訊,如果列印 stats 物件可以得到檔案基本屬性 ``` Stats { dev: 16777220, mode: 16877, nlink: 3, uid: 501, gid: 20, rdev: 0, blksize: 4096, ino: 4301278483, size: 96, blocks: 0, atimeMs: 1588483554315.173, mtimeMs: 1588483370684.5703, ctimeMs: 1588483370684.5703, birthtimeMs: 1588483342193.8625, atime: 2020-05-03T05:25:54.315Z, mtime: 2020-05-03T05:22:50.685Z, ctime: 2020-05-03T05:22:50.685Z, birthtime: 2020-05-03T05:22:22.194Z } ``` stats 物件還提供了幾個非常有用的屬性、方法獲取檔案的更多資訊,比較常用的有 1. stats.isDirectory():判斷檔案是否是個資料夾 1. stats.isFile():判斷檔案是否是普通檔案 1. stats.isSymbolicLink():判斷檔案是否是軟連結 1. stats.size:獲取檔案位元組數 ```javascript const fs = require('fs'); fs.stat('.', (err, stats) =>