32

我正在尝试使用递归搜索返回指定目录中的文件。我成功地实现了这一点,但是我想添加几行代码,以便我指定我想要返回的某些扩展。

例如仅返回目录中的 .jpg 文件。

这是我的代码,

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

请让我知道我可以在上面的代码中添加什么来实现这一点,谢谢

4

9 回答 9

40
<?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";
}
?>
于 2009-12-07T14:46:11.103 回答
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)
    ...
于 2009-12-07T14:58:27.877 回答
7

试试这个,它使用一组允许的文件类型,并且只有在文件扩展名存在于数组中时才会回显文件。

<?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类,并且只返回匹配的文件。

于 2009-12-07T14:46:39.527 回答
6

让 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);
于 2016-06-21T11:18:07.413 回答
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 />";
    }
}
于 2016-07-16T21:11:18.417 回答
1

这些都不适合我的情况。所以我写了这个功能,不确定效率,我只是想快速删除一些重复的照片。希望它可以帮助别人。

function rglob($dir, $pattern, $matches=array())
{
    $dir_list = glob($dir . '*/');
    $pattern_match = glob($dir . $pattern);

    $matches = array_merge($matches, $pattern_match);

    foreach($dir_list as $directory)
    {
        $matches = rglob($directory, $pattern, $matches);
    }

    return $matches;
}

$matches = rglob("C:/Bridge/", '*(2).ARW');

唯一可以做出的微小改进是,目前要使其正常工作,您必须在开始目录上有一个尾部正斜杠。

于 2020-08-02T11:13:39.050 回答
1

在此示例代码中;

  • 您可以为变量设置任何路径$directory,例如./'L:\folder\folder\folder'或任何...
  • $pattern您还可以在可选中设置模式文件名,您可以'/\.jpg$/'为每个带有.jpg扩展名的文件放置,如果您想查找所有文件,也可以使用'//'此变量。
$directory = 'L:\folder\folder\folder';
$pattern = '/\.jpg$/'; //use "//" for all files
$directoryIterator = new RecursiveDirectoryIterator($directory);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator);
$regexIterator = new RegexIterator($iteratorIterator, $pattern);
foreach ($regexIterator as $file) {
    if (is_dir($file)) continue;
    echo "$file\n";
}
于 2020-10-23T23:01:38.150 回答
0

这是在文件夹和子文件夹中搜索的正确方法

$it = new RecursiveDirectoryIterator(__DIR__);
$findExts = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)
{        
    $ext = pathinfo($file, PATHINFO_EXTENSION);
    if(in_array($ext, $findExts)){
        echo $file.PHP_EOL;
    }
}
于 2022-02-02T03:30:24.053 回答
-1

您可能想查看有关使用 glob() 进行类似搜索的此页面:

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

于 2013-10-17T10:08:10.073 回答