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 }) 在目录已存在时静默成功。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台