• 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;
                    }
                }
            }
        }
    }
    

      

  • 相关阅读:
    echarts饼状图位置设置
    去除echarts饼状图的引导线
    VS2008里的代码如何格式化
    使用ADO如何获得SQLSERVER 2K的数据库名的列表
    CStdioFile.WriteString无法向文件写入中文
    使用ODBC 数据库 ,运行程序时 出现 “遇到不适当的参数”
    CListCtrl消息及解释
    VC的CListCtrl控件
    找不到Microsoft Access Driver(*.mdb)ODBC驱动程序的安装例程。请重新安装驱动
    WebBrowser 控件-说明
  • 原文地址:https://www.cnblogs.com/huangye-dream/p/3393158.html
Copyright © 2020-2023  润新知