最可靠判断文件夹是否存在应直接使用 is_dir(),它专用于目录检测、语义明确、不受路径末尾斜杠影响,但需注意空路径、权限、大小写及符号链接问题。

用 is_dir() 判断文件夹是否存在最可靠
直接用 is_dir(),别用 file_exists() 代替——后者虽然也能返回 true,但无法区分同名文件和目录,容易埋雷。
常见错误现象:file_exists('/path/to/dir') 返回 true,结果后续 scandir() 报错 Warning: scandir(): Not a Directory,就是因为那其实是个普通文件。
-
is_dir()只对真实目录返回true,语义明确 - 路径末尾加不加斜杠不影响判断(
/tmp和/tmp/都行) - 如果路径是符号链接,
is_dir()检查的是目标目录,不是链接本身(想检查链接存在用is_link()) - 注意权限:即使目录存在,若 php 进程无执行权限(
x),is_dir()仍返回false
路径为空或包含空格时 is_dir() 会静默失败
PHP 不报错,但返回 false,容易误判为“不存在”。本质是函数内部把空字符串、全空格字符串当作无效路径处理了。
使用场景:用户上传表单字段拼接路径、配置项未初始化、trim() 没做全。
立即学习“PHP免费学习笔记(深入)”;
- 调用前先用
trim()清理路径:$path = trim($user_input); - 加一层非空校验:
if (!$path || !is_string($path)) { /* 拒绝处理 */ } - 开发时可临时加日志:
error_log("Checking dir: '" . $path . "' (len=" . strlen($path) . ")");
windows 下大小写不敏感,linux 下严格区分
这不算是 bug,但常导致跨平台部署出问题:本地测试通过,上线后 is_dir('Uploads') 在 Linux 上返回 false,因为实际目录名是 uploads。
性能影响几乎为零,但逻辑一致性会被破坏。
- 统一用小写命名目录,PHP 代码里也全小写调用
- 避免依赖大小写做逻辑分支(比如
if (is_dir('Config')) { ... } elseif (is_dir('config')) { ... }) - CI/CD 中可加简单检查脚本:
find . -maxdepth 1 -type d | grep -E '[A-Z]'
安全边界:不要用 is_dir() 做权限校验
它只回答“是不是目录”,不回答“能不能读/写/进入”。很多开发者误以为 is_dir() 返回 true 就能放心 scandir() 或 mkdir(..., 0755),结果运行时报错。
典型错误信息:Warning: scandir(/var/www/uploads): Permission denied
- 真正需要操作前,用
is_readable()或is_writable()单独校验 -
is_executable()才决定能否chdir()或scandir()——Linux 下目录的执行位(x)控制是否可进入 - 如果只是创建子目录,
mkdir()自带失败检测,比提前用is_dir()+is_writable()更简洁
路径合法性、权限、大小写、符号链接——四个点串起来,才是生产环境里真正靠谱的判断链。漏掉任何一个,都可能让 is_dir() 返回看似合理实则误导的结果。