递归文件搜索(PHP)

Jas*_*son 26 php file-search

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

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

这是我的代码,

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

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

Jan*_*čič 34

<?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";
}
?>
Run Code Online (Sandbox Code Playgroud)

  • 只有变量应该通过引用传递 (4认同)

Gre*_*reg 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)
    ...
Run Code Online (Sandbox Code Playgroud)

  • 这将不起作用,如果您在找到目录时停止(if -&gt;isFile()),迭代器不会深入该目录以扫描更多文件和目录,这比单行 if 更复杂。 (2认同)

Ben*_*ard 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";
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

您可能还会发现可以将一组允许的文件类型传递给您的RecursiveDirectoryIterator类,并且只返回匹配的文件.


emi*_*mix 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);
Run Code Online (Sandbox Code Playgroud)