PHP中readdir仅返回点号,同逻辑函数却正常的问题求助
问题分析与解决方案
这个问题很典型——你的scan函数只调用了一次readdir(),这就是为什么它只返回.的原因。
核心原因
readdir()函数的工作机制是每次调用仅返回目录中的一个条目,而目录的默认条目列表里,第一个就是.(代表当前目录),第二个是..(代表上级目录)。你的函数打开目录后,只读取了第一个条目就直接返回,自然只能得到.。
而你另一个能正常读取所有内容的函数,肯定是通过循环持续调用readdir(),直到遍历完所有条目,所以能拿到目录里的文件夹和文件。
修复后的函数代码
我们可以修改函数,通过循环收集所有有效条目(排除.和..):
function scan($dir){ $items = []; // 先判断目录是否能成功打开 if ($dirHandle = opendir($dir)) { // 循环读取每个条目,直到readdir返回false(无更多内容) while (($itemName = readdir($dirHandle)) !== false) { // 跳过当前目录和上级目录这两个特殊条目 if ($itemName !== '.' && $itemName !== '..') { $items[] = $itemName; } } // 关闭目录句柄,避免资源泄漏 closedir($dirHandle); } return $items; }
代码说明
- 初始化空数组
$items用来存储目录里的有效内容 - 增加目录打开的判断,避免因目录不存在/权限不足导致报错
- 使用
while循环遍历所有条目:readdir()会依次返回每个条目,直到没有内容时返回false - 过滤掉
.和..这两个系统默认的特殊目录,只保留实际的文件和子文件夹 - 最后关闭目录句柄,这是良好的资源管理习惯
调用修改后的scan('/home/user/scan/scan-test2'),就能得到包含目标目录下所有文件夹和文本文件的数组了。
内容的提问来源于stack exchange,提问作者SoManyQuestions
相关产品推荐
相关产品推荐

