Node.js FS 目錄與權限管理:資料夾操作與存取控制

除了處理單一檔案,開發者也經常需要管理龐大的資料夾結構、監控目錄變動以及精細地控制檔案權限。Node.js 提供了強大的 fs 工具來應對這些任務。

目錄操作 (Directory Operations)

建立目錄:mkdir

在建立多層目錄時,務必開啟 recursive: true 參數。否則,如果父層資料夾不存在,程式會直接拋出錯誤。

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

async function initializeWorkspace() {
  try {
    // 同時建立 logs/daily/2026/01 三層資料夾
    await fs.mkdir('logs/daily/2026/01', { recursive: true });
    console.log('目錄結構初始化完成');
  } catch (err) {
    console.error('建立目錄失敗:', err);
  }
}

讀取目錄內容:readdir

如果你需要精確區分檔案與目錄,建議開啟 withFileTypes 選項,這會回傳 Dirent 物件而非單純的字串。

async function listContents() {
  const entries = await fs.readdir('./', { withFileTypes: true });

  for (const entry of entries) {
    const icon = entry.isDirectory() ? '📂' : '📄';
    console.log(`${icon} ${entry.name}`);
  }
}

刪除目錄:rm 與 rmdir

  • rmdir:傳統方法,僅能刪除「空」目錄。
  • rm (推薦):Node.js 14+ 引入,功能更強大。
    • recursive: true:刪除目錄及其內部所有檔案與子資料夾。
    • force: true:若目錄不存在也不會報錯。
// 強制遞迴刪除 logs 資料夾
await fs.rm('logs', { recursive: true, force: true });

檔案權限管理 (Permissions)

每個檔案在作業系統層級都有存取權限。Node.js 讓我們能夠動態地調整它們。

修改權限:chmod

權限通常以八進位數字表示。例如 0o755 代表擁有者可讀寫執行,其他人僅可讀取與執行。

// 將敏感檔案設為僅擁有者可讀取 (Read-only for owner)
await fs.chmod('secret.key', 0o400);

檢查存取能力:access

在進行操作前,先確認目前進程是否有權限讀取或執行該檔案。

const { constants } = require('fs');
try {
  await fs.access('app.js', constants.R_OK | constants.W_OK);
  console.log('可讀可寫');
} catch {
  console.error('權限不足或檔案不存在');
}

目錄監控:watch

當你需要開發自動化工具(例如偵測檔案變動後自動重啟)時,可以使用 watch

const watcher = fs.watch('./configs', (eventType, filename) => {
  console.log(`偵測到變動:${eventType} - ${filename}`);
  // 可以在此觸發重新載入設定檔的邏輯
});

// 當不再需要監控時,記得關閉以節省資源
// watcher.close();
跨平台提醒:檔案權限與 watch 的行為在 Windows 與 Linux/macOS 之間存在顯著差異。推薦在開發自動化工具時,考慮使用如 chokidar 這樣的第三方成熟套件。

總結

  1. fs.rm 是目前最穩定且推薦的刪除目錄方式。
  2. 建立目錄時永遠記得帶上 recursive: true
  3. 善用 withFileTypes 能省下你手動呼叫 fs.stat 的檢查時間。