2013-12-23 83 views
-1

我想問問我有什麼補充,使這個功能不僅顯示在上面目錄中的文件,而且在子目錄中的文件..PHP函數讀取子目錄內容

private function _populateFileList() 
{ 
    $dir_handle = opendir($this->_files_dir); 
    if (! $dir_handle) 
    { 
     return false; 
    } 

    while (($file = readdir($dir_handle)) !== false) 
    { 
     if (in_array($file, $this->_hidden_files)) 
     { 
      continue; 
     } 

     if (filetype($this->_files_dir . '/' . $file) == 'file') 
     { 
      $this->_file_list[] = $file; 
     } 
    } 
    closedir($dir_handle); 

    return true; 
} 

感謝您在提前!

+1

問這個問題的正確途徑是:這裏是我對我所做的在一個給定的遞歸讀取文件是什麼頂層目錄[1],但它不起作用,因爲我得到了目錄樹[3]的輸出[2]。我做錯了什麼? –

+0

對不起,這是我第一次來這裏,我沒有經驗..我必須改變這一點還是沒問題? – kos

+0

你必須改變你未來的行爲。下次你提出問題時,表明你已經做了一些研究並嘗試瞭解決問題的實際方法。這是獲得幫助和讓別人做你的工作之間的界限。 –

回答

0

通過這一點,你可以得到所有子目錄內容

customerdel('FolderPath'); 



function customerdel($dirname=null){ 
     if($dirname!=null){ 
     if (is_dir($dirname)) 
      $dir_handle = opendir($dirname); 
     if (!$dir_handle) 
       return false; 
     while($file = readdir($dir_handle)) { 
       if ($file != "." && $file != "..") { 
       if (!is_dir($dirname."/".$file)) 
        echo $dirname."/".$file.'<br>'; 
       else{ 
        echo $dirname.'/'.$file.'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'; 
         customerdel($dirname.'/'.$file); 
       } 
       } 
     } 
     closedir($dir_handle); 
     }  
    } 
2

你可以自己實現遞歸,或者你可以使用現有的迭代器類來處理你的遞歸和文件系統遍歷:

$dirIterator  = new RecursiveDirectoryIterator('.', FilesystemIterator::SKIP_DOTS); 
$recursiveIterator = new RecursiveIteratorIterator($dirIterator); 
$filterIterator = new CallbackFilterIterator($recursiveIterator, function ($file) { 
    // adjust as needed 
    static $badFiles = ['foo', 'bar', 'baz']; 
    return !in_array($file, $badFiles); 
}); 

$files = iterator_to_array($filterIterator); 

var_dump($files); 
0

以下是如何獲取目錄及其子目錄中所有文件的遞歸數組。

返回的數組是這樣的:array([fileName] => [filePath])

編輯:我已經包括了一個小檢查是否有相同名稱的子目錄中的文件名。如果是這樣,下劃線和反被添加到鍵名返回數組中: array([fileName]_[COUNTER] => [filePath])

private function getFileList($directory) { 
    $fileList = array(); 
    $handle = opendir($directory); 
    if ($handle) { 
     while ($entry = readdir($handle)) { 
      if ($entry !== '.' and $entry !== '..') { 
       if (is_dir($directory . $entry)) { 
        $fileList = array_merge($fileList, $this->getFileList($directory . $entry . '/')); 
       } else { 
        $i = 0; 
        $_entry = $entry; 

        // Check if filename is allready in use 
        while (array_key_exists($_entry, $fileList)) { 
         $i++; 
         $_entry = $entry . "_$i"; 
        } 
        $fileList[$_entry] = $directory . $entry; 
       } 
      } 
     } 
     closedir($handle); 
    } 
    return $fileList; 
}