zoukankan      html  css  js  c++  java
  • 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;
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    gitlab配置ssh连接
    java 函数编程之Consumer接口的使用
    一枚程序猿的MacBook M1详细体验报告
    【线上问题排查技巧】动态修改LOGGER日志级别
    【线上排查实战】AOP切面执行顺序你真的了解吗
    阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后
    使用Binlog日志恢复误删的MySQL数据实战
    Git实战技巧:恢复被强制push -f失踪的代码
    一次完整的JVM堆外内存泄漏故障排查记录
    Java线上问题排查神器Arthas快速上手与原理浅谈
  • 原文地址:https://www.cnblogs.com/huangye-dream/p/3393158.html
Copyright © 2011-2022 走看看