递归文件搜索(PHP)

时间:2009-12-07 14:42:34

标签: php file-search

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

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

这是我的代码,

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

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

8 个答案:

答案 0 :(得分:32)

<?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";
}
?>

答案 1 :(得分: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)
    ...

答案 2 :(得分: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类,并且只返回匹配的文件。

答案 3 :(得分:5)

让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);

答案 4 :(得分: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 />";
    }
}

答案 5 :(得分: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');

唯一可以做的改进是,要使其正常工作,您必须在起始目录上使用斜杠。

答案 6 :(得分:0)

在此示例代码中;

  • 您可以为$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";
}

答案 7 :(得分:-1)

您可能需要查看此页面,了解如何使用glob()进行类似的搜索:

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