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

 1 <html>
 2     <body>
 3         <?php
 4             function traverse($path = '.') {
 5                 $current_dir = opendir($path);    //opendir()返回一个目录句柄,失败返回false
 6                 while(($file = readdir($current_dir)) !== false) {    //readdir()返回打开目录句柄中的一个条目
 7                     $sub_dir = $path . DIRECTORY_SEPARATOR . $file;    //构建子目录路径
 8                     if($file == '.' || $file == '..') {
 9                         continue;
10                     } else if(is_dir($sub_dir)) {    //如果是目录,进行递归
11                         echo 'Directory ' . $file . ':<br>';
12                         traverse($sub_dir);
13                     } else {    //如果是文件,直接输出
14                         echo 'File in Directory ' . $path . ': ' . $file . '<br>';
15                     }
16                 }
17             }
18             
19             traverse('xxtt');
20         ?>
21     </body>
22 </html>

页面输出

Directory autoload:
File in Directory d:wwwautoload: MyClass.php
File in Directory d:wwwautoload: MyClass2.php
File in Directory d:wwwautoload: 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:wwwExcel: oleread.inc
File in Directory d:wwwExcel: oleread.php
File in Directory d:wwwExcel: 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:wwwlistFile: listFile.php
File in Directory d:www: nQueens.php
Directory proxypass:
Directory proxy:
File in Directory d:wwwproxypassproxy: login.php
File in Directory d:wwwproxypassproxy: result.php
File in Directory d:wwwproxypass: success.php
File in Directory d:www: README
File in Directory d:www: somefile0.php
Directory Study:
Directory .idea:
File in Directory d:wwwStudy.idea: .name
File in Directory d:wwwStudy.idea: encodings.xml
File in Directory d:wwwStudy.idea: misc.xml
File in Directory d:wwwStudy.idea: modules.xml
File in Directory d:wwwStudy.idea: Study.iml
File in Directory d:wwwStudy.idea: vcs.xml
File in Directory d:wwwStudy.idea: workspace.xml
File in Directory d:wwwStudy: NSquare.php
File in Directory d:wwwStudy: regular.php
Directory templates:
File in Directory d:wwwStudy emplates: tpl.php
Directory templates_c:
File in Directory d:wwwStudy emplates_c: com_tpl.html.php
File in Directory d:wwwStudy emplates_c: com_tpl.php.php
File in Directory d:wwwStudy: test.php
Directory sub:
File in Directory d:wwwsub: index.php
Directory template:
File in Directory d:www emplate: template.php
Directory templates:
File in Directory d:www emplate emplates: tpl.html
Directory templates_c:
File in Directory d:www emplate emplates_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."
";
        //如果是目录
        if (is_dir($file))
        {
            $children = scandir($file);
            foreach ($children as $child)
            {
                if ($child !== '.' && $child !== '..')
                {
                    $list[] = $file.'/'.$child;
                }
            }
        }
    }
}

  

原文地址:https://www.cnblogs.com/huangye-dream/p/3393158.html