<html>
<body>
<?php
function traverse($path = '.') {
$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
} else if(is_dir($sub_dir)) { //如果是目录,进行递归
echo 'Directory ' . $file . ':<br>';
traverse($sub_dir);
} else { //如果是文件,直接输出
echo 'File in Directory ' . $path . ': ' . $file . '<br>';
}
}
} traverse('xxtt');
?>
</body>
</html>

页面输出

Directory autoload:
File in Directory d:\www\autoload: MyClass.php
File in Directory d:\www\autoload: MyClass2.php
File in Directory d:\www\autoload: test.php
File in Directory d:\www: changelog.txt
File in Directory d:\www: cryptForm.php
File in Directory d:\www: diffDomain.php
Directory ExamingOnline:
Directory New folder:
File in Directory d:\www: example.php
File in Directory d:\www: example2.php
Directory Excel:
File in Directory d:\www\Excel: oleread.inc
File in Directory d:\www\Excel: oleread.php
File in Directory d:\www\Excel: reader.php
File in Directory d:\www: expert.xls
File in Directory d:\www: expert.xlsx
File in Directory d:\www: index.php
File in Directory d:\www: index2.php
File in Directory d:\www: jxlrwtest.xls
File in Directory d:\www: lcs.php
Directory listFile:
File in Directory d:\www\listFile: listFile.php
File in Directory d:\www: nQueens.php
Directory proxypass:
Directory proxy:
File in Directory d:\www\proxypass\proxy: login.php
File in Directory d:\www\proxypass\proxy: result.php
File in Directory d:\www\proxypass: success.php
File in Directory d:\www: README
File in Directory d:\www: somefile0.php
Directory Study:
Directory .idea:
File in Directory d:\www\Study\.idea: .name
File in Directory d:\www\Study\.idea: encodings.xml
File in Directory d:\www\Study\.idea: misc.xml
File in Directory d:\www\Study\.idea: modules.xml
File in Directory d:\www\Study\.idea: Study.iml
File in Directory d:\www\Study\.idea: vcs.xml
File in Directory d:\www\Study\.idea: workspace.xml
File in Directory d:\www\Study: NSquare.php
File in Directory d:\www\Study: regular.php
Directory templates:
File in Directory d:\www\Study\templates: tpl.php
Directory templates_c:
File in Directory d:\www\Study\templates_c: com_tpl.html.php
File in Directory d:\www\Study\templates_c: com_tpl.php.php
File in Directory d:\www\Study: test.php
Directory sub:
File in Directory d:\www\sub: index.php
Directory template:
File in Directory d:\www\template: template.php
Directory templates:
File in Directory d:\www\template\templates: tpl.html
Directory templates_c:
File in Directory d:\www\template\templates_c: com_tpl.html.php
Directory test:
Directory adodb5:

如果要遍历某个目录下的所有文件(包括子目录),最首先想到的思路就是用递归:先处理当前目录,再处理当前目录下的子目录。不用递归可不可以呢?以前学数据结构的时候看到过,递归其实是利用堆栈来实现的,递归的特点就是不断的调用自身,最后一次的调用是最先执行完的,倒数第二次调用是其次执行完的,依次类推,最初的调用是最后执行完的。如果理解了递归的原理,其实就可以把所有用递归的实现转化为非递归的实现。

用非递归方式遍历某个目录下的所有文件,思路主要分三步:

1. 创建一个数组,将要遍历的这个目录放入;(其实就是创建了一个栈)
2. 循环处理这个数组,循环结束的条件是数组为空;
3. 每次循环,处理数组中的一个元素,并将元素删除,如果这个元素是目录,则将目录下所有的子元素加入数组;

按照这种思路写出的代码如下:

/**
* 遍历某个目录下的所有文件
* @param string $dir
*/
function scanAll($dir)
{
$list = array();
$list[] = $dir;
while (count($list) > 0)
{
//弹出数组最后一个元素
$file = array_pop($list);
//处理当前文件
echo $file."\r\n";
//如果是目录
if (is_dir($file))
{
$children = scandir($file);
foreach ($children as $child)
{
if ($child !== '.' && $child !== '..')
{
$list[] = $file.'/'.$child;
}
}
}
}
}

  

PHP遍历文件夹及子文件夹所有文件(此外还有飞递归的方法)的更多相关文章

  1. 遍历文件夹及其子文件夹下的.pdf文件,并解压文件夹下所有的压缩包

    List<PDFPATH> pdfpath = new List<PDFPATH>(); List<string> ziplist = new List<st ...

  2. Delphi遍历文件夹及子文件夹(可查找固定格式文件)

    Delphi遍历文件夹及子文件夹 {-------------------------------------------------------------------------------过程名 ...

  3. 键盘录入一个文件夹路径,统计该文件夹(包含子文件夹)中每种类型的文件及个数,注意:用文件类型(后缀名,不包含.(点),如:"java","txt")作为key, 用个数作为value,放入到map集合中,遍历map集合

    package cn.it.zuoye5; import java.io.File;import java.util.HashMap;import java.util.Iterator;import ...

  4. Java 遍历指定文件夹及子文件夹下的文件

    Java 遍历指定文件夹及子文件夹下的文件 /** * 遍历指定文件夹及子文件夹下的文件 * * @author testcs_dn * @date 2014年12月12日下午2:33:49 * @p ...

  5. shell 批量压缩指定文件夹及子文件夹内图片

    shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...

  6. Linux C 读取文件夹下所有文件(包括子文件夹)的文件名【转】

    转自:https://www.cnblogs.com/xudong-bupt/p/3504442.html 本文:http://www.cnblogs.com/xudong-bupt/p/350444 ...

  7. (转) Ubuntu 更改文件夹及子文件夹权限

    Linux系统下如何修改文档及文件夹(含子文件夹)权限,我们来看一下. 一 介绍: 可以使用命令chmod来为文件或目录赋予权限.Linux/Unix 的档案存取权限分为三级 : 档案拥有者.群组.其 ...

  8. Windows批量修改文件夹及子文件夹下文件的扩展名

    实例:将 D:/backup 目录下所有后缀名为 “.zip” 的文件替换为 “.exe” 后缀 bat批处理: @echo off rem 不显示执行过程 D: rem 切换至指定盘符 cd D:/ ...

  9. BAT 遍历文件夹和子文件夹下所有文件

    echo off & color 0A ::指定起始文件夹 set DIR="%cd%" echo DIR=%DIR% :: 参数 /R 表示需要遍历子文件夹,去掉表示不遍 ...

  10. linux修改文件夹及其子文件夹的权限

    加入-R 参数,就可以将读写权限传递给子文件夹例如chmod -R 777 /home/mypackage那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777.777是读.写.执行 ...

随机推荐

  1. FreeBSD下安装lua

    额,一行命令搞定啊 make freebsd CC=clang && make install 花了我一晚上,问题是啥呢? 我在Makefile中压根没有看到CC的定义在哪儿,然后直接 ...

  2. SpringMVC 多视图解析器配置以及问题

    在SpringMVC模式当中可以通过如下配置来支持多视图解析 <!-- jsp jstl --> <bean id="JSPViewResolver" class ...

  3. 课后作业——用lastIndexOf判断是否是字符串的最后一位

    package test; public class Testlianxi { public static void main(String[] args) { //判断fgh是否是字符串的最后一位 ...

  4. uboot全局数据gd_t、bd_t和device_t

    gd_t定义在include/asm-arm/global_data.h 33  /* Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE &g ...

  5. DateTime获取一个月的第一天和最后一天

    DateTime dtTarget = DateTime.Now; DateTime FirstDay = dtTarget.AddDays(-DateTime.Now.Day + ); DateTi ...

  6. ionic2 生命周期

    在 Ionic 2 的版本中生命周期命名的改变,以及各个事件的解释. 官方文档地址在 这里 . 事件名称 事件说明 ionViewLoaded 页面加载完毕触发.该事件发生在页面被创建成 DOM 的时 ...

  7. 第三百零九节,Django框架,models.py模块,数据库操作——F和Q()运算符:|或者、&并且——queryset对象序列化

    第三百零九节,Django框架,models.py模块,数据库操作——F()和Q()运算符:|或者.&并且 F()可以将数据库里的数字类型的数据,转换为可以数字类型 首先要导入 from dj ...

  8. jquery获取当前select下拉选的属性值

    body中: <li> <select id="select_phone"></select> <input type="but ...

  9. html文档流和事件流

    文档流: 标准文档流,float position: relative.absolute.fixed可以脱离标准文档流: 回归标准文档流: https://blog.csdn.net/Welkin_q ...

  10. React封装RadioGroup

    class RadioGroup extends React.Component { getRadioComponent(item, index) { return <div className ...