以递归方式打印文件夹中的所有文件和文件夹

以递归方式打印文件夹中的所有文件和文件夹

问题描述:

我想递归地列出文件夹中的所有文件和文件夹。我已经编写了代码来获取输出,但我无法以正确的嵌套方式显示。以递归方式打印文件夹中的所有文件和文件夹

<?php 


class CheckFolder{ 

    public function getSubFolders($dir) 
    { 
     $folders = array(); 
     $ffs = scandir($dir); 
     foreach($ffs as $ff) 
     { 
      if($ff != '.' && $ff != '..') 
      { 
       if(is_dir($dir.'/'.$ff)) $folders[] = $ff; 
      } 
     } 
     return $folders;  
    } 

    public function getFiles($dir) 
    { 
     $files = array(); 
     if(is_dir($dir)) 
     { 
      $ffs = scandir($dir); 
      foreach($ffs as $ff) 
      { 
       if($ff != '.' && $ff != '..') 
       { 
        if(!is_dir($dir.'/'.$ff)) $files[] = '<li>'.$ff.'</li>'; 
       } 
      } 
     } 
     return $files; 
    }  

    function listFolderFiles($dir) 
    { 
     $ffs  = scandir($dir); 
     $folders = $this->getSubFolders($dir); 
     $files = $this->getFiles($dir); 

     if(strpos($dir, '/') >0) 
     { 
      $folderName = substr($dir, strrpos($dir, '/') + 1); 
     } 
     else 
     {   
      $folderName = $dir; 
     } 
     echo '<ul>'; 
     echo '<li>'.$folderName.'</li>'; 
     if(count($files) > 0) 
     { 
      echo '<ul>'; 
      foreach($files as $file) 
      { 
       // /echo '<li>'.$file.'</li>'; 
       echo $file; 
      } 
      echo '</ul>'; 
     } 

     echo '</ul>'; 

     foreach($folders as $folder) 
     { 
      // echo '<li>'.$folderName.'</li>'; 
      $this->listFolderFiles($dir.'/'.$folder); 
     } 

    } 


} 

$dir = 'test'; 
$folder = new CheckFolder(); 
$folder->listFolderFiles($dir) 

?> 

电流输出 enter image description here

预计:

enter image description here

+0

如果将它作为子文件夹检查,那么再次调用函数,这次将'foreach($ pf as $ f)'“'$ f'”var作为参数传递给它。不要忘记检查里面的foreach文件夹是否有孩子,因为如果不是它的叶子文件夹和新的数组不应该再次开始。 [看看是否有帮助](http://*.com/questions/640931/recursively-counting-files-with-php)。 –

我不知道你是否已经看过,并可能打折,内置的recursiveIteratorrecursiveDirectoryIterator组类?

下面并不关心你引用的缩进,但它是一个很好的方法(尽管可能不如你自己制作的递归函数那么快)遍历路径中的所有目录。

该手册是稀疏与恕我直言好例子,但下面可能会感兴趣的,尤其是当你可以像CHILD_FIRST指定的东西。

$folder=__DIR__; 
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($folder, RecursiveDirectoryIterator::KEY_AS_PATHNAME), RecursiveIteratorIterator::CHILD_FIRST) as $file => $info) { 
    if($info->isFile() && $info->isReadable() && $info->isWritable()){ 
     echo $info->getPathname() .' ' . $info->getFilename().BR; 
    } 
}