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 這樣的第三方成熟套件。總結
fs.rm是目前最穩定且推薦的刪除目錄方式。- 建立目錄時永遠記得帶上
recursive: true。 - 善用
withFileTypes能省下你手動呼叫fs.stat的檢查時間。