2015-08-28 142 views
0

我想遞歸地列出文件夾中的所有文件和文件夾。我已經編寫了代碼來獲取輸出,但我無法以正確的嵌套方式顯示。以遞歸方式打印文件夾中的所有文件和文件夾

<?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://stackoverflow.com/questions/640931/recursively-counting-files-with-php)。 –

回答

2

我不知道你是否已經看過,並可能打折,內置的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; 
    } 
} 
相關問題