2010-12-28 14 views
15
foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")) as $file) { 
    echo "$file\n"; 
} 

C'è un modo per questo codice di non gettare UnexpectedValueException "non è riuscito ad aprire dir: Permesso negato" ogni volta che c'è una sottodirectory illeggibile all'interno directory tento di elencare?Posso fare in modo che RecursiveDirectoryIterator salti le directory illeggibili?

UPDATE

Conversione foreach() a while() e chiamando esplicitamente Iterator::next() avvolto in try() catch {} non aiuta. Questo codice:

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

è un ciclo infinito se è presente una sottodirectory illeggibile.

+0

avvolgerlo in blocchi catch try. e sembra essere una cattiva idea creare nuovi oggetti proprio all'interno di foreach parentesi – s3v3n

+0

Per elaborare sul commento di s3v3n. Sembra essere una cattiva idea, perché quello che sta succedendo è molto difficile da determinare. Il buon codice non è sempre il codice più piccolo o più veloce. – DampeS8N

+0

Non è difficile determinare cosa succede se si conosce RecursiveIteratorIterator e RecursiveDirectoryIterator e qual è il loro caso d'uso comune. È un codice semplice. –

risposta

19

A quanto pare si può passare $flags parametro al costruttore. C'è solo one flag in the docs, ma fa esattamente quello che vuoi: catches exceptions during getChildren() calls and simply jumps to the next element.

modificare il codice di creazione della classe di

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

e dovrebbe funzionare

+0

Questo è esattamente ciò di cui avevo bisogno. Grazie mille! –

+0

Ho un problema simile chiesto qui http://stackoverflow.com/questions/14410899/unable-to-skip-unreadable-directories-with-recursivedirectoryiterator Avete delle idee su come posso rielaborare si soluzione per risolvere il mio problema? – ak85

+0

In particolare, il flag è: CATCH_GET_CHILD –

0

E 'possibile che la posizione dell'iteratore sarà ancora valida anche se una directory non è leggibile.

Si potrebbe verificare lo stato della voce di directory. Sloppy codice di esempio non testati:

$iter = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(".")); 
foreach ($iter as $dir) { 
    if($dir->isReadable()){ 
     //do something 
    } 
} 
+0

Non funziona. L'eccezione viene generata mentre l'iteratore avanza alla posizione successiva. –

7

Si potrebbe fare qualcosa di simile:

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"; 
} 
+0

È molto interessante. –

Problemi correlati