PHP递归目录迭代器 - 忽略某些文件。

时间:2013-08-16 09:55:35

标签: php iterator

我有一个递归目录迭代器来从目录中选择文件。 SKIP_DOTS允许我忽略'。'和'..'元素,但我希望能够忽略'__MACOSX'目录和另一个其他隐藏文件,如'.cache.php'

$iterator = new RecursiveDirectoryIterator($directory);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$all_files  = new RecursiveIteratorIterator($iterator); 

还有其他答案herehere,但只是想知道是否有更清洁的方式?

我希望PHP Manual - FilesystemIterator SetFlags会有某些东西,但似乎没有。

3 个答案:

答案 0 :(得分:10)

感谢@Sven和PHP Docs:

$iterator = new RecursiveDirectoryIterator($directory);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);

$filter = new MyRecursiveFilterIterator($iterator);

$all_files  = new RecursiveIteratorIterator($filter,RecursiveIteratorIterator::SELF_FIRST);

然后延长RecursiveFilterIterator

class MyRecursiveFilterIterator extends RecursiveFilterIterator {

    public static $FILTERS = array(
        '__MACOSX',
    );

    public function accept() {
        return !in_array(
            $this->current()->getFilename(),
            self::$FILTERS,
            true
        );
    }

}

根据评论In the PHP Manual

答案 1 :(得分:1)

在RecursiveIteratorIterator和RecursiveDirectoryIterator之间添加一个过滤层:创建一个RecursiveFilterIterator并编写accept()函数,如果希望元素在结果中,则返回true。将目录迭代器放入过滤器迭代器中,将过滤器迭代器放在RecursiveIteratorIterator中。迭代。

对于“__MACOSX”目录等特殊情况,没有预定义的SKIP常量。

答案 2 :(得分:0)

要过滤其他项目,可以使用Blob。这个 很好,因为使用击中过滤器的文件夹,会修剪整个子路径。 这是一个过滤文件和子文件夹的示例:

ArrayBuffer

https://php.net/class.recursivecallbackfilteriterator