我有一个递归目录迭代器来从目录中选择文件。 SKIP_DOTS允许我忽略'。'和'..'元素,但我希望能够忽略'__MACOSX'目录和另一个其他隐藏文件,如'.cache.php'
$iterator = new RecursiveDirectoryIterator($directory);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$all_files = new RecursiveIteratorIterator($iterator);
还有其他答案here和here,但只是想知道是否有更清洁的方式?
我希望PHP Manual - FilesystemIterator SetFlags会有某些东西,但似乎没有。
答案 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);
class MyRecursiveFilterIterator extends RecursiveFilterIterator {
public static $FILTERS = array(
'__MACOSX',
);
public function accept() {
return !in_array(
$this->current()->getFilename(),
self::$FILTERS,
true
);
}
}
答案 1 :(得分:1)
在RecursiveIteratorIterator和RecursiveDirectoryIterator之间添加一个过滤层:创建一个RecursiveFilterIterator并编写accept()
函数,如果希望元素在结果中,则返回true。将目录迭代器放入过滤器迭代器中,将过滤器迭代器放在RecursiveIteratorIterator中。迭代。
对于“__MACOSX”目录等特殊情况,没有预定义的SKIP常量。
答案 2 :(得分:0)
要过滤其他项目,可以使用Blob
。这个
很好,因为使用击中过滤器的文件夹,会修剪整个子路径。
这是一个过滤文件和子文件夹的示例:
ArrayBuffer