我有一个递归目录描述符,如下所示:
$theme_iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($theme_folder_path)
);
foreach ($theme_iterator as $file_object) {
// Stuff
}
问题是它会迭代到.svn隐藏文件夹中。我该如何防止这种情况发生?
编辑:
我不能在foreach中添加这样的内容,因为此时隐藏文件夹中的文件在数组中都准备好了,而且它们并没有全部隐藏。
if (strpos($file_object, ".") ===0) {
continue;
}
<?php
class RecursiveDotFilterIterator extends RecursiveFilterIterator
{
public function accept()
{
return '.' !== substr($this->current()->getFilename(), 0, 1);
}
}
$iterator = new RecursiveIteratorIterator(
new RecursiveDotFilterIterator(
new RecursiveDirectoryIterator('.')
)
);
foreach ($iterator as $x) {
//do stuff
}
设置flag
RecursiveDirectoryIterator::SKIP_DOTS
以排除文件:
$iterator = new RecursiveDirectoryIterator($theme_folder_path);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$theme_iterator = new RecursiveIteratorIterator(
$iterator
);
以下是使用RecursiveCallbackFilterIterator
:的另一种方法
<?php
function iterate(string $path): object {
function filter(object $info): bool {
if ($info->isFile()) {
return true;
}
return $info->getFilename()[0] !== '.';
}
$RDI = new RecursiveDirectoryIterator($path);
$RCFI = new RecursiveCallbackFilterIterator($RDI, 'filter');
return new RecursiveIteratorIterator($RCFI);
}
foreach (iterate('.') as $info) {
echo $info->getPathname(), "'n";
}
https://php.net/class.recursivecallbackfilteriterator
如果你想在一行中完成:
$iterator = new RecursiveDirectoryIterator($path_directory, RecursiveDirectoryIterator::SKIP_DOTS);