gpt4 book ai didi

php - 如何使用 RecursiveIteratorIterator 忽略目录?

转载 作者:可可西里 更新时间:2023-11-01 13:50:37 27 4
gpt4 key购买 nike

我尝试了几种方法来在文件系统上使用 RecursiveIteratorIterator 忽略某些目录。

为了举例说明,我想忽略以下目录:/cache

我的 Iterator 看起来像这样:

//$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 忽略目录的最简单、最有效的方法是什么?


失败的实验。使用 PATHINFO_DIRNAME

$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

这导致错误:需要创建它的 RecursiveIterator 或 IteratorAggregate 实例

最佳答案

您的 DirFilter 想要扩展 RecursiveFilterIterator,因为它与递归迭代器一起使用。不这样做是导致错误的原因。

class DirFilter extends RecursiveFilterIterator
{
// …
}

下一步是弄清楚如何正确使用 accept()。它应该返回一个 truefalse 值,这表明当前项目是应该被包含 (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, …);

关于php - 如何使用 RecursiveIteratorIterator 忽略目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15369291/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com