2013-08-16 14 views
5

Ho un iteratore di directory ricorsivo per selezionare i file da una directory. SKIP_DOTS mi consente di ignorare il '.' e '..' elementi, ma mi piacerebbe essere in grado di ignorare anche directory '__MACOSX' e un altro altri file nascosti come '.cache.php'PHP Recursive Directory Iterator - ignora determinati file.

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

Non ci sono altre risposte here e here ma mi chiedevo solo se ci fosse un modo più pulito?

Speravo che ci fosse qualcosa nello PHP Manual - FilesystemIterator SetFlags ma non sembra.

+0

Perché speravate di qualcosa di built-in? È irragionevole aspettarsi che qualcuno scriva alcune righe di codice quando hanno requisiti speciali? Nei sistemi Windows si vedono spesso file speciali 'desktop.ini' e' Thumbs.db', ​​dovrebbe esserci un flag speciale anche per quelli? – Jon

+0

Potrebbe essere utile: http://stackoverflow.com/questions/12454114/exclude-folders-from-recursion-in-recursive-directory-iterator-php –

+0

@Jon Vedo il punto, ma perché includere "RecursiveDirectoryIterator :: SKIP_DOTS 'se non per aiutare casi d'uso comuni? – Kiksy

risposta

8

Grazie alla @Sven e il PHP Documenti:

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

$filter = new MyRecursiveFilterIterator($iterator); 

$all_files = new RecursiveIteratorIterator($filter,RecursiveIteratorIterator::SELF_FIRST); 

poi esteso RecursiveFilterIterator

class MyRecursiveFilterIterator extends RecursiveFilterIterator { 

    public static $FILTERS = array(
     '__MACOSX', 
    ); 

    public function accept() { 
     return !in_array(
      $this->current()->getFilename(), 
      self::$FILTERS, 
      true 
     ); 
    } 

} 

Come per il commento In the PHP Manual

+0

Questo dipende dal flag RecursiveDirectoryIterator' impostato, qui il codice si aspetta 'parent :: current()' per restituire un oggetto 'SplFileInfo' - ma può anche essere una stringa. In alternativa si può lavorare su 'RecursiveDirectoryIterator' stesso e usare' $ this-> getBasename() '(il filtro decora) o' $ this-> getFilename() '. Solo aggiungendo. Anche fare attenzione nel costruttore di accettare "RecursiveDirectoryIterator' come' $ iterator' può essere utile. Ho inserito un codice in un gist per i file nascosti di Linux: ['HiddenFilesAndFolderFilterIterator.php'] (https://gist.github.com/hakre/11111534) – hakre

1

Aggiungere un livello di filtro tra RecursiveIteratorIterator e RecursiveDirectoryIterator: Creare un RecursiveFilterIterator e codificare la funzione accept() che restituisce true se si desidera che l'elemento si trovi nel risultato. Inserisci l'iteratore di directory nel filtro iteratore, inserisci l'iteratore del filtro in RecursiveIteratorIterator. Iterate.

Non esiste una costante SKIP predefinita per casi speciali come le directory "__MACOSX".

Problemi correlati