You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码说明

  1. 初始化空数组$items用来存储目录里的有效内容
  2. 增加目录打开的判断,避免因目录不存在/权限不足导致报错
  3. 使用while循环遍历所有条目:readdir()会依次返回每个条目,直到没有内容时返回false
  4. 过滤掉.和..这两个系统默认的特殊目录,只保留实际的文件和子文件夹
  5. 最后关闭目录句柄,这是良好的资源管理习惯

调用修改后的scan('/home/user/scan/scan-test2'),就能得到包含目标目录下所有文件夹和文本文件的数组了。

内容的提问来源于stack exchange,提问作者SoManyQuestions

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:41