極簡 Node.js 入門 - 3.4 資料夾寫入

謙行發表於2020-08-23

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

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

fs.Dir & fs.Dirent

fs.Dir 是可迭代的目錄流的類,fs.Dirent 是遍歷 fs.Dir 獲得的目錄項,可以是檔案或目錄中的子目錄

fs.Dir

  • dir.path:目錄的只讀路徑
  • dir.read():不傳入 callabck 函式則返回 Promise,讀取迭代器下一個目錄項,返回一個 Promise,resolve 後得到 fs.Dirent 或 null(如果沒有更多的目錄項要讀取)
  • dir.close():不傳入 callabck 函式則返回 Promise,關閉目錄的底層資源控制程式碼

fs.Dirent

  • dirent.name
  • dirent.isDirectory()
  • dirent.isFile()
  • dirent.isSymbolicLink()

fs.opendir

fs.opendir(path[, options], callback) 開啟一個目錄,返回 fs.Dir 物件

const fs = require('fs/promises');

async function print(path) {
  const dir = await fs.opendir(path);
  for await (const dirent of dir) {
    console.log(dirent.name);
  }
}
print('./').catch(console.error);

可以通過 dir.read() 迭代 dir

const fs = require('fs/promises');

async function print(path) {
  const dir = await fs.opendir(path);
  let dirent = await dir.read();
  while (dirent) {
    console.log(dirent.name);
    dirent = await dir.read();
  }

  dir.close();
}
print('./').catch(console.error);

fs.readdir

fs.readdir(path[, options], callback) 讀取目錄的內容,回撥有兩個引數 (err, files),其中 files 是目錄中的檔名的陣列(不包括 '.' 和 '..')
options

  • encoding:預設值 utf8,如果 encoding 設定為 'buffer',則返回的檔名是 Buffer 物件
  • withFileTypes:預設值 false,設定為 true 後回撥函式 files 陣列將包含 fs.Dirent 物件
const fs = require('fs/promises');

async function print(path) {
  const files = await fs.readdir(path);
  for (const file of files) {
    console.log(file);
  }
}
print('./').catch(console.error);

fs.mkdir

fs.mkdir(path[, options], callback) 建立目錄
options

  • recursive:預設值 false,設定為 true 時候相當命令 mkdir -p 會把不存在的目錄建立
  • mode:預設值 0o777,Windows 不支援
// 建立 /tmp/a/apple 目錄,無論是否存在 /tmp 和 /tmp/a 目錄。
fs.mkdir('/tmp/a/apple', { recursive: true }, err => {
  if (err) throw err;
});

fs.rmdir

fs.rmdir(path[, options], callback) fs.rmdir 用於刪除資料夾
options

  • recursive:預設值 false,如果為 true,則執行遞迴的目錄刪除。在遞迴模式中,如果 path 不存在則不報告錯誤,並且在失敗時重試操作
  • retryDelay:預設值 100,出現異常後重試之間等待毫秒數。如果 recursive 選項不為 true,則忽略此選項
  • maxRetries:預設值為 0,表示出現異常後重試的次數,如果遇到 EBUSY、 EMFILE、 ENFILE、 ENOTEMPTY 或 EPERM 錯誤,則 Node.js 將會在每次嘗試時以 retryDelay 毫秒的線性回退來重試該操作。 如果 recursive 為 false,則忽略此選項
const fs = require('fs');

fs.rmdir('./tmp', { recursive: true }, err => console.log);

之前 rmdir 只能刪除空的資料夾,現在可以連同檔案一起刪除了

相關文章