mkdir()仅创建目录而不遍历,opendir()与readdir()组合才实现遍历;需先用is_dir()判断存在性,mkdir支持递归创建,opendir后须配closedir()防泄漏,scandir()更简洁但一次性加载全部内容。

PHP 中 mkdir() 本身不参与遍历,它只负责创建目录;真正完成遍历任务的是 opendir() 和 readdir() 的组合。三者常出现在同一业务流程中:先用 mkdir() 确保目标目录存在,再用 opendir() 打开它,最后靠 readdir() 逐个读取内容。
mkdir 是“铺路”,不是“走路”
mkdir() 的作用是创建目录结构,比如上传前确保 uploads/2026/11 路径存在。它不读文件、不进子目录、也不返回文件列表。如果目录已存在,直接跳过即可,避免报错:
- 用
is_dir()预判是否存在 - 权限建议设为
0755(Linux)或省略(Windows 不生效) - 需递归创建时,第三个参数传
true,例如:mkdir('a/b/c', 0755, true)
opendir + readdir 是标准遍历搭档
目录存在后,才能安全调用 opendir() 获取句柄,再用 readdir() 循环提取条目。关键点在于过滤掉两个特殊项:
-
.表示当前目录 -
..表示上级目录 - 每次
readdir()返回一个字符串(文件或子目录名),指针自动后移 - 必须配对使用
closedir(),防止资源泄漏
一个完整可运行的例子
以下代码创建目录后立即遍历其内容(假设无子目录):
立即学习“PHP免费学习笔记(深入)”;
$dir = 'logs';
if (!is_dir($dir)) {
mkdir($dir, 0755);
}
if ($handle = opendir($dir)) {
while (false !== ($entry = readdir($handle))) {
if ($entry === '.' || $entry === '..') continue;
echo "发现: {$entry}\n";
}
closedir($handle);
}
注意:这段代码不会递归进入子目录。如需深度遍历,需自行封装递归函数或改用 scandir() + is_dir() 判断后再进入。
替代方案:scandir 更简洁但功能不同
如果只是要一次性获取全部文件名(不含路径),scandir() 比 opendir/readdir 组合更轻量:
- 返回数组,自动包含
.和..,需手动array_diff()过滤 - 不涉及句柄管理,无需
closedir() - 不支持边读边处理大目录(全部加载到内存)



















