php – 如何使用RecursiveIteratorIterator忽略目录?
我已经尝试了几种方法来在文件系统上使用RecursiveIteratorIterator忽略某些目录.
为了举例说明我想忽略以下目录:/ cache. 我的迭代器看起来像这样: //$dirname is root $directory = new RecursiveDirectoryIterator($dirname); $mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST); foreach ($mega as $fileinfo) { echo $fileinfo; } 我已经能够使用pathinfo忽略某些文件扩展名,例如这有效: $filetypes = array("jpg","png"); $filetype = pathinfo($fileinfo,PATHINFO_EXTENSION); foreach ($mega as $fileinfo) { if (!in_array(strtolower($filetype),$filetypes)) { echo $fileinfo; } } 当我使用PATHINFO_DIRNAME(在数组中使用相应的目录路径)尝试它时,它不起作用,没有错误,它只是不忽略目录. 我也试过使用FilterIterator无济于事,现在我想也许我应该使用RegexIterator. 使用RecursiveIteratorIterator忽略目录的最简单,最有效的方法是什么? 实验没有用. $dirignore = array("cache","cache2"); $directory = new RecursiveDirectoryIterator($dirname); $mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST); $dirtype = pathinfo($fileinfo,PATHINFO_DIRNAME); if (!in_array($dirtype),$dirignore)) { echo $fileinfo; //no worky still echo directories } 使用FilterIterator(不知道这是如何工作的) class DirFilter extends FilterIterator { public function accept() { //return parent::current() != "..cache"; $file = $this->getInnerIterator()->current(); if ($file != "..cache") return $file->getFilename(); //also tried with same error as below //return !preg_match('/cache',$file->getFilename()); } } $directory= new RecursiveDirectoryIterator($dirname); $directory = new DirFilter($directory); $mega = new RecursiveIteratorIterator($directory,RecursiveIteratorIterator::SELF_FIRST); // loop Tis导致错误:需要RecursiveIterator或IteratorAggregate创建它的实例 解决方法
您的DirFilter想要扩展RecursiveFilterIterator,因为它与递归迭代器一起使用.不这样做是导致错误的原因.
class DirFilter extends RecursiveFilterIterator { // … } 下一步是弄清楚如何正确使用accept().它应该返回一个true或false值,它指示当前项应该包含(true)还是从迭代中排除(false).从accept()返回文件名不是您想要做的. class DirFilter extends RecursiveFilterIterator { public function accept() { $excludes = array("cache","cache2"); return !($this->isDir() && in_array($this->getFilename(),$excludes)); } } 能够传入排除目录数组可能会很好.这需要更多的代码,但更可重用. class DirFilter extends RecursiveFilterIterator { protected $exclude; public function __construct($iterator,array $exclude) { parent::__construct($iterator); $this->exclude = $exclude; } public function accept() { return !($this->isDir() && in_array($this->getFilename(),$this->exclude)); } public function getChildren() { return new DirFilter($this->getInnerIterator()->getChildren(),$this->exclude); } } 然后可以使用此代码,如: $directory = new RecursiveDirectoryIterator($dirname); $filtered = new DirFilter($directory,$dirignore); $mega = new RecursiveIteratorIterator($filtered,…); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |