極簡 Node.js 入門 - 3.1 File System API 風格


極簡 Node.js 入門系列教程:https://www.yuque.com/sunluyong/node

本文更佳閱讀體驗:https://www.yuque.com/sunluyong/node/fs-api-style

Node.js 對文件、文件夾讀寫操作主要靠內置的 fs 模塊

const fs = require('fs');

fs 模塊提供了幾種不同調用風格的 API 支持文件讀寫,fs.stat 方法可以獲取文件的基本信息,下面示例展示了不同風格 API 調用 fs.stat 方法

callback 風格

Node.js 默認的異步操作是 callback 風格 callback(err, returnValue)

  1. err: 如果程序處理出現異常,錯誤信息放在回調函數的第一個參數,如果沒有錯誤 err 為 null
  2. returnValue:程序正常處理完成后結果放在回調函數第二個參數
const fs = require('fs');

fs.stat('.', (err, stats) => {
  if(err) {
  	// 處理錯誤。
  } else {
  	 // 使用 stats
  }
});

fs promise API

fs.promises API 提供了一組和 callback 風格對應的方法,返回 Promise 對象而不使用回調,避免出現 callback 嵌套的回調地獄問題


API 可通過 require('fs').promisesrequire('fs/promises')訪問

require('fs/promises') v14 后可用

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 風格方法

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 方法也有對應的同步版本

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():判斷文件是否是個文件夾
  2. stats.isFile():判斷文件是否是普通文件
  3. stats.isSymbolicLink():判斷文件是否是軟鏈接
  4. stats.size:獲取文件字節數
const fs = require('fs');

fs.stat('.', (err, stats) => {
  if(!err) {
    console.log(stats);
    console.log(stats.isFile());
    console.log(stats.size);
  }
});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM