讲师中心 微信公众号
AI工具推荐 视频效率加速

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

陌杰姑娘_8358

陌杰姑娘_8358

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

|

970人浏览过

|

来源于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),同时严格过滤 '.' 和 '..'。

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

btpanel phpsite 宝塔面板PHP网站
btpanel phpsite 宝塔面板PHP网站

宝塔面板 PHP 网站管理:站点创建、删除、启停、PHP 版本切换、域名管理、SSL证书管理、伪静态管理、数据库管理

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

    // 获取当前目录下所有条目
    $entries = scandir($location);
    if ($entries === false) {
        echo "Warning: Cannot read directory '$location'<br>";
        return;
    }

    foreach ($entries as $entry) {
        // 跳过当前目录和上级目录
        if ($entry === '.' || $entry === '..') {
            continue;
        }

        $fullPath = rtrim($location, '/') . '/' . $entry;

        if (is_dir($fullPath)) {
            echo "<strong>? $entry/</strong><br>"; // 可视化层级
            scan($fullPath); // 递归进入子目录
        } else {
            echo "? $entry<br>";
        }
    }
}

// 启动遍历(从当前目录开始)
scan('.');

? 进阶建议:

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

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

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

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

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

798

2025.12.04

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

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

6995

2025.09.05

java面向对象
java面向对象

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

362

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

364

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

243

2026.04.17

location.assign
location.assign

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

2982

2023.06.27

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

20

2026.10.28

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

0

2026.10.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
墨刀帮助中心
墨刀帮助中心

共0课时 | 0人学习

MyEclipse学习中心
MyEclipse学习中心

共0课时 | 0人学习

Apache Subversion 官方手册
Apache Subversion 官方手册

共0课时 | 0人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn