7

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

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

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

我希望 PHP 手册中会有一些东西- FilesystemIterator SetFlags但似乎没有。

4

3 回答 3

11

感谢@Sven 和 PHP 文档:

$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
        );
    }

}

根据PHP 手册中的评论

于 2013-08-16T10:30:16.020 回答
1

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

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

于 2013-08-16T10:01:26.193 回答
1

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

<?php

$f_filter = function ($o_info) {
   $s_file = $o_info->getFilename();
   if ($s_file == '.git') {
      return false;
   }
   if ($s_file == 'readme.md') {
      return false;
   }
   return true;
};

$o_dir = new RecursiveDirectoryIterator('.');
$o_filter = new RecursiveCallbackFilterIterator($o_dir, $f_filter);
$o_iter = new RecursiveIteratorIterator($o_filter);

foreach ($o_iter as $o_info) {
   echo $o_info->getPathname(), "\n";
}

https://php.net/class.recursivecallbackfilteriterator

于 2020-08-28T22:53:51.820 回答