PHP实现目录遍历与文件信息获取的两种常用方法
本文将详细讲解在PHP环境中,如何利用 opendir 配合 readdir 或 glob 函数高效遍历文件夹。文中包含完整的代码实例,涵盖读取文件名、大小、类型及时间戳的具体操作,帮助你快速掌握目录遍历的核心逻辑。
目标:获取目录下的文件清单与属性
在处理文件系统操作时,通常需要列出指定目录内的所有文件,并获取其详细信息(如文件名、大小、类型等)。PHP提供了两套主流方案:一是通过底层句柄顺序读取(opendir/readdir),二是通过全局搜索函数(glob)直接获取数组。
准备条件
- 环境:已安装 PHP 的运行环境(Apache/Nginx + PHP)。
- 权限:PHP 进程用户对目标目录拥有读取权限(
read)。 - 路径:明确要遍历的物理目录或相对路径。
方法一:使用 opendir/readdir 逐个读取(传统方式)
这种方法类似“走马观花”,逐行打开目录流并读取指针,适合需要实时处理或内存较小的场景。
第1步:定义变量并打开目录句柄
首先定义目标目录名(例如 phpmyadmin),并使用 opendir() 打开它。如果打开失败,建议增加错误处理。
第2步:循环读取并过滤 “.” 与 “..”
readdir() 每次会返回一个条目。在大多数实际业务中,我们需要跳过系统自带的 .(当前目录)和 ..(父目录),否则会导致逻辑错误或重复。
<?php
// test.php
$dirname = 'phpmyadmin'; // 定义目录名
$num = 0; // 计数器
if ($dir_handle = opendir($dirname)) {
echo "<b>开始遍历 </b>$dirname:<br>";
while ($file = readdir($dir_handle)) {
// 关键步骤:排除 . 和 ..
if ($file != '.' && $file != '..') {
$filePath = $dirname . '/' . $file;
// 可选:区分文件和目录
if (is_dir($filePath)) {
echo "[目录] : " . $file . "<br>";
} else {
// 仅处理普通文件的示例:获取大小、类型、创建时间
echo "文件名: $file | ";
echo "大小: " . filesize($filePath) . " 字节 | ";
echo "类型: " . filetype($filePath) . " | ";
echo "创建时间: " . date("Y/n/t", filectime($filePath)) . "<br>";
$num++;
}
}
}
closedir($dir_handle); // 关闭句柄
echo '共找到 ' . $num . ' 个文件<br>';
} else {
echo '无法打开目录!';
}
?>第3步:重置与二次读取(可选)
rewinddir() 可以将内部指针重新移回目录开头。这在需要对同一目录进行多次不同格式输出时非常有用(例如下面的演示代码):
// 再次打开以便演示 rewinddir
$dir = opendir($dirname);
// ... 执行第一次遍历 ...
rewinddir($dir); // 指针复位
while ($filename = readdir($dir)) {
if ($filename != '.' && $filename != '..') {
// 执行第二次逻辑...
}
}
closedir($dir); 方法二:使用 glob() 批量获取(简洁方式)
如果你只需要拿到文件名数组,不需要精细控制读取过程,glob() 是更现代、更安全的做法。它能一次性将符合条件的路径放入数组。
<?php
// glob.php
// GLOB_ALL 常量用于开启所有匹配项
$files = glob('phpmyadmin/*');
if ($files) {
foreach ($files as $filename) {
echo $filename . '<br>';
}
} else {
echo '未找到匹配文件或目录为空';
}
?>完成判断与注意事项
- 路径准确性:在拼接路径时,务必确认使用的是绝对路径还是相对路径,建议使用
realpath()获取真实物理路径以避坑。 - 性能差异:
readdir是流式读取,内存占用低;glob是一次性加载,若目录含有数万个文件,可能会导致内存溢出。 - 编码问题:在 Windows 环境下,中文文件名可能因编码不一致导致读取为空或乱码,需留意系统的默认编码设置。
简要总结
PHP 遍历目录的核心在于选择正确的工具:opendir/readdir 适用于需要深度定制读取过程的场景,而 glob 则适合简单的文件列表提取。无论哪种方法,过滤 . 和 .. 以及正确闭合句柄都是保证程序健壮性的必要条件。
以上就是PHP遍历目录实现方法的详细内容,更多关于PHP目录遍历的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









