2011-12-11 171 views
1

獲取所有子目錄列表以及php中給定目錄下所有文件的另一個列表的最佳方式是什麼?只要我可以在PHP中使用它(例如,c/java/python/...程序),我就可以使用非純php代碼。東西比純recursion快,一些內置的一些語言php獲取所有子目錄和所有文件的列表

+1

什麼是你想要的輸出?數組?一個很好格式化的字符串? UNIX'''''''''命令爲顯示目錄提供了一個漂亮的字符串。 '''find'''列出了相關的路徑,這些路徑可以被PHP解析。 – FakeRainBrigand

回答

2

如果你不喜歡OOing的東西,你可以通過find的結果運行一個opendir()循環。

if (exec('find /startdir -type d -print', $outputarray)) { 
    foreach ($outputarray as $onepath) { 
    // do stuff in $onepath 
    } 
} 

您確實指定了「不純PHP」作爲選項,對吧? :-)

+1

對......... :) – prongs

+1

公頃。我喜歡這個答案:) –

0

使用PHP的內置RecursiveDirectoryIterator

編輯

喜歡的東西(因爲這些東西往往是快的。):

$dirs = array(); 
$files = array(); 

$dir = __DIR__ . '/foo'; 

$iterator = new RecursiveDirectoryIterator(new DirectoryIterator($dir)); 

foreach ($iterator as $dirElement) { 
    if ($dirElement->isDir()) { 
     $dirs[] $dirElement->getPathname(); 
    } 
    if ($dirElement->isFile()) { 
     $files[] = $dirElement->getPathname(); 
    } 
} 
+0

就像'NikiC'一樣,這是純粹的遞歸,OP想避免什麼。 'RecursiveDirectoryIterator'只是讓程序員不用編寫自己的遞歸函數。 – Jon

+0

採取了點。我認爲OP意味着他想避免手動遞歸實現。猜猜我讀錯了。我們可以要求OP澄清我的想法。無論如何,感謝downvote。 –

4

看看RecursiveDirectoryIterator

foreach (new RecursiveDirectoryIterator('yourDir') as $file) { 
    // you don't want the . and .. dirs, do you? 
    if ($file->isDot()) { 
     continue; 
    } 

    if ($file->isDir()) { 
     // dir 
    } else { 
     // file 
    } 
} 
+1

'RecursiveDirectoryIterator'是遞歸的,如名稱所示。 – Jon

+0

@Jon我應該澄清並說'RecursiveDirectoryIterator'是* pure *遞歸,並且對每個'dir'執行遞歸掃描,這是OP試圖避免的。 – Jon

+3

@Jon好吧,你不能用遞歸進行遞歸目錄遍歷 - 根據定義。這是不可能的。你總是會使用某種遞歸,無論是純粹的還是隱藏的。 RecursiveDirectoryIterator是解決這個問題的一個非常乾淨的方法。 – NikiC

1

php.net的文檔採取glob()

$path[] = 'starting_place/*'; 

while(count($path) != 0) { 
    $v = array_shift($path); 

    foreach(glob($v) as $item) { 
    if(is_dir($item)) 
     $path[] = $item . '/*'; 
    else if (is_file($item)) { 
     //do something 
    } 
    } 
} 
1
class Dir_helper{ 
    public function __construct(){ 

    } 
    public function getWebdirAsArray($rootPath){ 
     $l1 = scandir($rootPath); 
     foreach ($this->getFileList($rootPath) as $r1){ 
     if ($r1['type'] == 'dir'){ 
      if (preg_match("/\./", $r1['name'])){ 
      $toplevel[] = $r1['name']; 
      } else { 
      if (preg_match("/\d/",$r1['name'])){ 
       $seclevel[] = $this->getFileList($r1['name']); 
      } 
      } 
     } 
     } 
     foreach ($seclevel as $sl){ 
     foreach ($sl as $cur){ 
      $sub[] = $cur['name']; 
     } 
     } 
     return $result = array_merge((array)$toplevel, (array)$sub); 
    } 

    public function getFileList($dir){ 
     $retval = array(); 
     if(substr($dir, -1) != "/") $dir .= "/"; 
     $d = @dir($dir) or die("getFileList: Failed opening directory $dir for reading"); 
     while(false !== ($entry = $d->read())) { 
      if($entry[0] == ".") continue; 
      if(is_dir("$dir$entry")) { 
       $retval[] = array(
       "name" => "$dir$entry/", 
       "type" => filetype("$dir$entry"), 
       "size" => 0, 
       "lastmod" => filemtime("$dir$entry") 
       ); 
      } elseif(is_readable("$dir$entry")) { 
       $retval[] = array(
       "name" => "$dir$entry", 
       "type" => mime_content_type("$dir$entry"), 
       "size" => filesize("$dir$entry"), 
       "lastmod" => filemtime("$dir$entry") 
       ); 
      } 
     } 
     $d->close(); 
     return $retval; 
    } 

} 
相關問題