2009-12-07 170 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 />"; 
    } 
}