Могу ли я заставить RecursiveDirectoryIterator пропускать нечитаемые каталоги? - PullRequest
15 голосов
/ 28 декабря 2010
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) {
  echo "$file\n";
}

Есть ли способ, чтобы этот код не генерировал исключение UnexpectedValueException "dir: Permission denied", когда в каталоге, который я пытаюсь перечислить, есть нечитаемый подкаталог?

UPDATE

Преобразование foreach() в while() и явный вызов Iterator::next() в try() catch {} не помогают.Этот код:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator("."));
while($iter->valid()) {
    $file = $iter->current();
    echo "$file\n";
    try {
        $iter->next();
    } catch(UnexpectedValueException $e) {
    }
};

- это бесконечный цикл, если есть нечитаемый подкаталог.

Ответы [ 2 ]

19 голосов
/ 29 декабря 2010

Очевидно, вы можете передать $flags параметр в конструктор. В документах есть только один флаг, но он делает именно то, что вы хотите: catches exceptions during getChildren() calls and simply jumps to the next element.

Измените код создания класса на

new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator("."), 
    RecursiveIteratorIterator::LEAVES_ONLY,
    RecursiveIteratorIterator::CATCH_GET_CHILD);

и должно работать

7 голосов
/ 28 декабря 2010

Вы можете сделать что-то вроде этого:

class ReadableFilter extends RecursiveFilterIterator{
    public function accept(){
            return $this->current()->isReadable();
    }
}

$filteredIterator = new RecursiveIteratorIterator(new ReadableFilter(new RecursiveDirectoryIterator(".")));

foreach ($filteredIterator as $file){
    echo "$file\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...