我发现,我可以得到该文件夹的所有子目录在PHP代码如下
$address = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($root, RecursiveDirectoryIterator::SKIP_DOTS),
RecursiveIteratorIterator::SELF_FIRST,
RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
);
并把它放在$地址。
我怎样才能增加一个标准,说,如果有子目录里面的“TMP”的文件夹,然后将其放在$地址?
你可以创建自己的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;
}
}
你也许可以通过创建自己添加的标准FilterIterator
,用于检查一个子目录。 下面的用法示例演示了这种列出文件夹我有下饭桶。
$address
是什么,你有你的问题已经,过滤器只是增加周围:
$filtered = new SubDirFilter($address, '.git');
foreach ($filtered as $file) {
echo $filtered->getSubPathname(), "\n";
}
输出:
Artax
CgiHttpKernel
CgiHttpKernel/vendor/silex/silex
...
composer
composer-setup
CVBacklog
...
,什么不是。 使用此过滤器,迭代器是相对直线前进,为每个条目它检查是否有subdiretory与否。 重要的是,你有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);
}
}