推荐使用 is_dir() 而非 file_exists() 判断目录是否存在,因为 is_dir() 严格区分文件与目录,避免同名文件导致 mkdir 失败;标准流程为先 is_dir() 判断,再 mkdir($path, 0755, true) 递归创建。

创建目录前判断是否已存在,最稳妥的方式是用 is_dir() 检查路径是否为有效目录。它比 file_exists() 更精准——后者对同名文件也会返回 true,容易导致误判或后续操作失败。
为什么推荐 is_dir() 而不是 file_exists()
file_exists() 只确认路径“存在”,不管它是文件还是目录。比如目标路径 logs 已被占用为普通文件,file_exists('logs') 返回 true,但紧接着调用 mkdir('logs') 会失败(因为不能在文件位置再建目录)。而 is_dir('logs') 明确返回 false,能及时拦截错误逻辑。
标准判断 + 创建流程
实际写法应组合判断与递归创建:
- 先用
is_dir($path)判断是否已是目录 - 不是目录才调用
mkdir($path, 0755, true),第三个参数true启用递归,自动补全缺失的父级路径 - 权限
0755是通用推荐值,Windows 下会被忽略,Linux/Unix 环境下控制读写执行权限
批量创建时的注意事项
遍历多个路径时,每个都需独立判断:
- 不要用
file_exists()统一判断,避免把文件当目录跳过 - 路径中避免非法字符(如
../、未转义空格),建议用realpath()或dirname()预处理 - 若高并发场景下频繁创建同一目录,可加简单文件锁(
flock())防重复尝试
一个安全可用的示例
以下代码适用于单个或批量路径:
$paths = ['uploads/2024/06', 'cache/templates', 'logs/error'];
foreach ($paths as $path) {
if (!is_dir($path)) {
if (!mkdir($path, 0755, true)) {
$error = error_get_last();
// 记录或抛出错误,例如:echo "创建 {$path} 失败: {$error['message']}";
}
}
}
关键点在于每次循环都走 is_dir() → 条件创建 → 失败捕获,不依赖外部状态,逻辑清晰且容错性强。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











