2009-12-07 116 views
22

我試圖使用遞歸搜索來返回指定目錄中的文件。 我成功實現了這一點,但是我想添加幾行代碼,這將允許我指定要返回的特定擴展名。遞歸文件搜索(PHP)

例如,只返回目錄中的.jpg文件。

這裏是我的代碼,

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
echo $file . "<br/> \n"; 
} 
?> 

請讓我知道我可以添加到上面的代碼來實現這一目標,感謝

回答

29
<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$display = Array ('jpeg', 'jpg'); 
foreach(new RecursiveIteratorIterator($it) as $file) 
{ 
    if (in_array(strtolower(array_pop(explode('.', $file))), $display)) 
     echo $file . "<br/> \n"; 
} 
?> 
6

試試這個,它使用允許的文件類型的數組如果文件擴展名存在於數組中,則只會回顯文件。

<?php 
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$allowed=array("pdf","txt"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) { 
     echo $file . "<br/> \n"; 
    } 
} 
?> 

您也可能會發現,你可以通過允許的文件類型的數組你RecursiveDirectoryIterator類,只返回匹配的文件。

20

你應該創建一個過濾器:

class JpegOnlyFilter extends RecursiveFilterIterator 
{ 
    public function __construct($iterator) 
    { 
     parent::__construct($iterator); 
    } 

    public function accept() 
    { 
     return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename()); 
    } 

    public function __toString() 
    { 
     return $this->current()->getFilename(); 
    } 
} 

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
$it = new JpegOnlyFilter($it); 
$it = new RecursiveIteratorIterator($it); 

foreach ($it as $file) 
    ... 
+1

這是行不通的,如果你停止找到一個目錄時(如果 - > ISFILE())的迭代器不深在該目錄內掃描更多的文件和目錄,是比單線更復雜。 – Tecnocat 2017-09-06 13:11:17

1

你可能想看看這個頁面有關使用水珠()進行類似的搜索:

http://www.electrictoolbox.com/php-glob-find-files/

+0

你的來源是好的,但嘗試用例子給出一個建設性的答案,如何資源可以用於特定的情況下,只添加鏈接作爲參考。 – 2014-11-25 12:35:09

+0

我不認爲glob處理遞歸,這也是問題的一部分。 – Oded 2015-08-13 21:14:28

3

讓PHP做的工作:

$directory = new RecursiveDirectoryIterator('path/to/directory/'); 
$iterator = new RecursiveIteratorIterator($directory); 
$regex  = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH); 

echo '<pre>'; 
print_r($regex); 
1

關於最高投票答案:我創建了這個代碼是使用很少呃功能,只有3個,isset(),array_flip(),explode()而不是4個功能。我測試了頂尖的投票答案,並且比我的慢。我建議給我的一個嘗試:

$it = new RecursiveDirectoryIterator("L:\folder\folder\folder"); 
foreach(new RecursiveIteratorIterator($it) as $file) { 
    $FILE = array_flip(explode('.', $file)); 
    if (isset($FILE['php']) || isset($FILE['jpg'])) { 
     echo $file. "<br />"; 
    } 
}