Node.js 如何同步检查文件或目录是否存在?
同步检查用 fs.existsSync(path),返回布尔值。注意 existsSync 已不推荐用于"检查再操作"(有竞态),更稳的做法是直接操作并捕获 ENOENT 错误。异步版本用 fs.promises.access。
直接答:fs.existsSync(path),存在返回 true,否则 false。
const fs = require('fs');
const pathToCheck = '/path/to/file_or_dir';
if (fs.existsSync(pathToCheck)) {
console.log('存在');
} else {
console.log('不存在');
}
文件和目录都适用。同步调用会阻塞事件循环,适合 CLI 脚本、启动初始化;服务端请求处理路径上别用。
异步版本(服务端推荐)
const fs = require('fs').promises;
try {
await fs.access('/path/to/file');
console.log('存在且可访问');
} catch {
console.log('不存在或不可访问');
}
注意 fs.promises 里没有 exists,用 access() 配合 try/catch 替代(它还能顺带检查读/写权限:fs.access(p, fs.constants.W_OK))。
重要提醒:检查-再操作有竞态
// ❌ 反模式:检查与操作之间文件可能被别的进程删掉
if (fs.existsSync(p)) {
fs.readFileSync(p); // 可能抛 ENOENT
}
// ✅ 正确姿势:直接操作,捕获错误
try {
const data = fs.readFileSync(p);
} catch (err) {
if (err.code === 'ENOENT') console.log('文件不存在');
else throw err;
}
这也是官方文档把 existsSync 标记为"不推荐用于存在性判断后再操作"的原因——判断结果和实际操作之间,文件状态可能已变化。
常见问题(FAQ)
Q:existsSync 被废弃了吗?
没有被废弃(Deprecation 早已撤销),可以正常用。官方建议的是别用它做"检查再打开"的守卫。
Q:想区分"文件"和"目录"怎么办?
用 fs.statSync(p).isFile() / .isDirectory(),existsSync 只回答存在与否。
Q:检查目录不存在就创建?
不必先检查:fs.mkdirSync(p, { recursive: true }) 在目录已存在时静默成功。