Node.js 如何在目录不存在时创建它?
Node.js 创建目录用 fs.mkdir 加 { recursive: true },目录已存在不报错、父目录自动创建,一行解决,无需先检查存在性。本文给出同步/异步/Promise 三种写法。
现代写法一行搞定:fs.mkdirSync(path, { recursive: true })。recursive: true 让已存在的目录不报错、缺失的父目录一并创建。
三种写法
同步(脚本场景):
const fs = require('fs');
fs.mkdirSync('./output/logs', { recursive: true });
Promise(推荐):
const fs = require('fs').promises;
await fs.mkdir('./output/logs', { recursive: true });
回调:
const fs = require('fs');
fs.mkdir('./output/logs', { recursive: true }, (err) => {
if (err) console.error(err);
});
老式写法(仅兼容老版本)
Node 10.12 之前没有 recursive 选项,只能先查再建:
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir);
}
这种写法有"检查后、创建前被别的进程抢先创建"的竞态。现在 Node 版本都支持 recursive,直接用它,不用先 existsSync。
常见问题(FAQ)
Q:recursive 模式下目录已存在会报错吗?
不会,静默成功(幂等)。这正是它适合"确保目录存在"场景的原因。
Q:报错 EACCES 权限不足?
目标路径没有写权限。检查父目录属主,或用有权限的路径;别图省事用 sudo 跑 Node。
Q:报错 ENOTDIR?
路径中某一级是文件而不是目录,例如 ./data.txt/logs。检查路径构成。
Q:要同时创建多级目录?
recursive: true 就是干这个的,./a/b/c 一次到位。