直接用 is_dir() 判断目录存在且是目录类型最稳妥,它隐含存在性检查,仅当路径存在、有读取权限且确为目录时返回 true,否则一律 false;不依赖扩展名或内容,符号链接按目标判断。

用 is_dir() 判断目录存在且是目录类型
直接用 is_dir() 是最稳妥的做法,它不仅检查路径是否存在,还确认它确实是一个目录(而非文件或符号链接)。如果路径不存在、是普通文件、或权限不足导致无法访问,is_dir() 都返回 false。
常见错误是先用 file_exists() 再判断类型,多此一举;或者误用 is_file() 反向推断,容易漏掉符号链接或权限异常情况。
-
is_dir()对软链接默认跟随目标——如果链接指向一个真实存在的目录,它返回true;若链接损坏或指向不存在路径,则返回false - Windows 下路径分隔符用
\或/均可,但建议统一用/避免转义问题 - 注意当前执行脚本的运行用户(如 www-data)是否有读取该目录父路径的权限,否则即使目录存在也会返回
false
// 正确示例
$path = '/var/www/uploads';
if (is_dir($path)) {
echo "目录存在且可访问";
} else {
echo "目录不存在、不是目录、或无权限访问";
}用 file_exists() 仅判断路径存在性(不区分类型)
file_exists() 只回答“这个路径有没有”,不管它是目录、文件还是挂载点。在某些场景下反而更合适——比如你只关心路径是否被占用,或后续会自己处理类型逻辑。
典型陷阱:有人用 file_exists() + !is_file() 推断是目录,但这会把命名管道、socket、设备文件等也当成“目录”,语义错误。
立即学习“PHP免费学习笔记(深入)”;
-
file_exists()不受 open_basedir 限制影响(而is_dir()可能受其限制并报 warning) - 对不存在的 NFS 挂载点或网络存储,
file_exists()可能阻塞数秒,is_dir()同样受影响 - 如果路径末尾带斜杠(如
'/tmp/dir/'),两个函数行为一致;但带不带斜杠不影响判断结果
创建目录前必须先判断?不一定
很多开发者习惯先 is_dir() 再 mkdir(),其实 mkdir() 自身就能处理“已存在”情况——只要加上 $recursive = true 和忽略警告即可。
- 用
@mkdir($path, 0755, true)可静默跳过“目录已存在”错误(@抑制 warning) - 更健壮的方式是用
if (!is_dir($path) && !mkdir($path, 0755, true)) { /* 失败处理 */ } - 注意
mkdir()的权限参数在 Linux 上受 umask 影响,实际创建的权限可能是0755 & ~umask
相对路径和 __DIR__ 拼接容易出错
写 is_dir('uploads') 看似简单,但它的基准是当前工作目录(getcwd()),不是脚本所在目录。线上环境常因 CLI 启动位置不同导致判断失败。
- 务必用
__DIR__ . '/uploads'或dirname(__FILE__) . '/uploads'构造绝对路径 - 避免拼接时漏掉
/,比如__DIR__ . 'uploads'会变成/var/wwwindex.phpuploads - PHP 8.1+ 支持
str_ends_with($path, '/')辅助校验,但判断存在性本身不需要这个
路径拼接和权限上下文比函数选型更容易出问题,尤其在容器或共享主机环境中——别只盯着 is_dir() 返回 false 就改逻辑,先确认路径对不对、用户能不能进上层目录。



















