0

0

如何使用 scandir() 实现安全可靠的递归目录遍历

霞舞

霞舞

发布时间:2026-02-03 16:11:01

|

930人浏览过

|

来源于php中文网

原创

如何使用 scandir() 实现安全可靠的递归目录遍历

本文详解如何用 php 的 scandir() 编写健壮的递归目录遍历函数,解决因路径拼接缺失、`.`/`..` 处理不当及参数类型混淆导致的“foreach() argument must be of type array|object”警告。

原始代码存在两个关键错误:

  1. 参数类型错乱:首次调用 scan($dir) 时传入的是 scandir('.') 返回的数组,但递归调用 scan($path) 时 $path 是相对文件名(如 "images"),而非完整路径;scandir($path) 尝试在当前工作目录下打开该子目录,若路径不存在或权限不足,则返回 false,导致后续 foreach(false) 触发致命警告。
  2. 未过滤特殊目录项:scandir() 总会返回 '.'(当前目录)和 '..'(父目录),若不显式跳过,将引发无限递归或跨目录遍历风险。

✅ 正确做法是:每次递归前,先用 scandir() 获取目标目录下的真实条目,并基于完整路径判断类型。需使用 realpath() 或手动拼接路径(推荐 dirname($location) . '/' . $path 或更安全的 rtrim($location, '/') . '/' . $path),同时严格过滤 '.' 和 '..'。

以下是修复后的完整可运行示例:

魔匠AI论文
魔匠AI论文

专业原创的AI论文写作工具,一站式解决论文选题、写作、文献综述、答辩PPT全流程,支持毕业论文、课程论文等多种类型,轻松助力高质量论文写作。

下载
function scan($location) {
    // 确保路径存在且为目录
    if (!is_dir($location)) {
        return;
    }

    // 获取当前目录下所有条目
    $entries = scandir($location);
    if ($entries === false) {
        echo "Warning: Cannot read directory '$location'
"; return; } foreach ($entries as $entry) { // 跳过当前目录和上级目录 if ($entry === '.' || $entry === '..') { continue; } $fullPath = rtrim($location, '/') . '/' . $entry; if (is_dir($fullPath)) { echo "? $entry/
"; // 可视化层级 scan($fullPath); // 递归进入子目录 } else { echo "? $entry
"; } } } // 启动遍历(从当前目录开始) scan('.');

? 进阶建议

  • 若需更高性能与健壮性,推荐使用 SPL 迭代器,例如 RecursiveDirectoryIterator + RecursiveIteratorIterator,它自动处理符号链接、权限异常并支持过滤规则;
  • 使用 DirectoryIterator 可替代基础 scandir(),代码更简洁且面向对象;
  • 生产环境务必添加错误抑制(如 @scandir())或异常捕获,并对 is_dir() / is_readable() 做双重校验,避免因权限问题中断遍历。

总结:递归目录扫描的核心在于——始终操作绝对/规范路径、主动过滤元目录项、确保每次 scandir() 输入合法目录、并对返回值做空值检查。遵循这三点,即可写出稳定、可维护的目录树遍历逻辑。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

117

2025.12.04

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

54

2025.11.27

location.assign
location.assign

在前端开发中,我们经常需要使用JavaScript来控制页面的跳转和数据的传递。location.assign就是JavaScript中常用的一个跳转方法。通过location.assign,我们可以在当前窗口或者iframe中加载一个新的URL地址,并且可以保存旧页面的历史记录。php中文网为大家带来了location.assign的相关知识、以及相关文章等内容,供大家免费下载使用。

226

2023.06.27

全国统一发票查询平台入口合集
全国统一发票查询平台入口合集

本专题整合了全国统一发票查询入口地址合集,阅读专题下面的文章了解更多详细入口。

1

2026.02.03

短剧入口地址汇总
短剧入口地址汇总

本专题整合了短剧app推荐平台,阅读专题下面的文章了解更多详细入口。

4

2026.02.03

植物大战僵尸版本入口地址汇总
植物大战僵尸版本入口地址汇总

本专题整合了植物大战僵尸版本入口地址汇总,前往文章中寻找想要的答案。

5

2026.02.03

c语言中/相关合集
c语言中/相关合集

本专题整合了c语言中/的用法、含义解释。阅读专题下面的文章了解更多详细内容。

2

2026.02.03

漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题
漫蛙漫画网页版入口与正版在线阅读 漫蛙MANWA官网访问专题

本专题围绕漫蛙漫画(Manwa / Manwa2)官网网页版入口进行整理,涵盖漫蛙漫画官方主页访问方式、网页版在线阅读入口、台版正版漫画浏览说明及基础使用指引,帮助用户快速进入漫蛙漫画官网,稳定在线阅读正版漫画内容,避免误入非官方页面。

4

2026.02.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号