SystemicPlural
SystemicPlural

Reputation: 5789

How do I make a RecursiveDirectoryIterator exclude hidden folders

I have a recursiveDirectoryIterator like this:

$theme_iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($theme_folder_path)
);
foreach ($theme_iterator as $file_object) {
   // Stuff
}

The problem is that it iterates into the .svn hidden folders. How can I prevent this?

Edit:

I can't just add something like this in the foreach because the files from the hidden folder are allready in the array at that point and they are not all hidden.

if (strpos($file_object, ".") ===0) {
    continue;
}

Upvotes: 3

Views: 2699

Answers (4)

Zombo
Zombo

Reputation: 1

Here is another approach using 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

Upvotes: 1

hugsbrugs
hugsbrugs

Reputation: 3611

If your want to do it in a single line :

$iterator = new RecursiveDirectoryIterator($path_directory, RecursiveDirectoryIterator::SKIP_DOTS); 

Upvotes: -1

sergio
sergio

Reputation: 5260

Set flag RecursiveDirectoryIterator::SKIP_DOTS to exlude files:

$iterator = new RecursiveDirectoryIterator($theme_folder_path);

$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
    $theme_iterator = new RecursiveIteratorIterator(
       $iterator
);

Upvotes: 3

BreyndotEchse
BreyndotEchse

Reputation: 2230

<?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
}

Upvotes: 5

Related Questions