Search code examples
phpiterator

PHP Recursive Directory Iterator - ignore certain files.


I have a recursive directory iterator to select files from within a directory. SKIP_DOTS allows me to ignore the '.' and '..' elements, but I'd like to be able to also ignore '__MACOSX' directory and another other hidden files such as '.cache.php'

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

There are other answers here and here but just wondered if there was a cleaner way?

I was hoping there was going to be something in PHP Manual - FilesystemIterator SetFlags but it seems not.


Solution

  • Thanks to @Sven and the PHP Docs:

    $iterator = new RecursiveDirectoryIterator($directory);
    $iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
    
    $filter = new MyRecursiveFilterIterator($iterator);
    
    $all_files  = new RecursiveIteratorIterator($filter,RecursiveIteratorIterator::SELF_FIRST);
    

    Then extended RecursiveFilterIterator

    class MyRecursiveFilterIterator extends RecursiveFilterIterator {
    
        public static $FILTERS = array(
            '__MACOSX',
        );
    
        public function accept() {
            return !in_array(
                $this->current()->getFilename(),
                self::$FILTERS,
                true
            );
        }
    
    }
    

    As per the comment In the PHP Manual