3

我发现我可以在 php 中使用以下代码获取文件夹的所有子目录

$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);

并将其放入 $address 中。

如何再添加一个条件并说明子目录中是否包含“tmp”文件夹,然后将其放入 $address 中?

4

2 回答 2

4

您可以创建自己的RecursiveFilterIterator

$dir = new RecursiveDirectoryIterator(__DIR__, 
        RecursiveDirectoryIterator::SKIP_DOTS);

$address = new RecursiveIteratorIterator(new TmpRecursiveFilterIterator($dir), 
        RecursiveIteratorIterator::SELF_FIRST, 
        RecursiveIteratorIterator::CATCH_GET_CHILD);


foreach($address as $dir) {
    echo $dir,PHP_EOL;
}

使用的类

class TmpRecursiveFilterIterator extends RecursiveFilterIterator {
    public function accept() {
        $file = $this->current();
        if ($file->isDir()) {
            return is_dir("$file/tmp");
        }
        return false;
    }
}
于 2013-05-05T21:09:25.067 回答
3

您可能可以通过自己创建一个FilterIterator检查子目录的条件来添加条件。以下使用示例演示了如何列出我在 git 下的文件夹。

$address是您在问题中已有的内容,过滤器只是添加到周围:

$filtered = new SubDirFilter($address, '.git');

foreach ($filtered as $file) {
    echo $filtered->getSubPathname(), "\n";
}

输出:

Artax
CgiHttpKernel
CgiHttpKernel/vendor/silex/silex
...
composer
composer-setup
CVBacklog
...

什么不是。使用的这个过滤器迭代器相对简单,对于每个条目,它都会检查它是否具有该子目录。启用此功能(已启用)很重要,FilesystemIterator::SKIP_DOTS否则您将得到重复的结果(表示相同的目录):

class SubDirFilter extends FilterIterator
{
    private $subDir;

    public function __construct(Iterator $iterator, $subDir) {
        $this->subDir = $subDir;
        parent::__construct($iterator);
    }

    public function accept() {
        return is_dir($this->current() . "/" . $this->subDir);
    }
}
于 2013-05-05T21:35:04.007 回答