如何使RecursiveDirectoryTerator排除隐藏的文件夹


How do I make a RecursiveDirectoryIterator exclude hidden folders

我有一个递归目录描述符,如下所示:

$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);