2013-08-16 26 views
5

Mam iterator katalogu rekurencyjnego do wybierania plików z katalogu. SKIP_DOTS pozwala mi zignorować "." a „..” elementy, ale chciałbym, aby móc również ignorować katalogu «__MACOSX», a drugim inne ukryte pliki, takie jak „.cache.php”PHP Recursive Directory Iterator - ignoruje określone pliki.

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

istnieją inne odpowiedzi here ale i here zastanawiałeś się, czy istnieje czystszy sposób?

Miałem nadzieję, że będzie coś w PHP Manual - FilesystemIterator SetFlags, ale wygląda na to, że nie.

+0

Dlaczego pan nadzieję na coś wbudowaną? Czy nieuzasadnione jest oczekiwanie, że ktoś napisze kilka linijek kodu, gdy mają specjalne wymagania? W systemach Windows często widzisz specjalne pliki 'desktop.ini' i' Thumbs.db', ​​czy powinna na nich być specjalna flaga? – Jon

+0

Może to pomoże: http://stackoverflow.com/questions/12454114/exclude-folders-from-recursion-in-recursive-directory-iterator-php –

+0

@Jon Widzę twoją sprawę, ale dlaczego warto uwzględnić "RecursiveDirectoryIterator :: SKIP_DOTS ", jeśli nie, aby pomóc w typowych przypadkach użycia? – Kiksy

Odpowiedz

8

Dzięki @Sven i PHP Docs:

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

$filter = new MyRecursiveFilterIterator($iterator); 

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

Następnie rozszerzony RecursiveFilterIterator

class MyRecursiveFilterIterator extends RecursiveFilterIterator { 

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

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

} 

Zgodnie z komentarzem In the PHP Manual

+0

To zależy od ustawionych flag 'RecursiveDirectoryIterator', tutaj kod oczekuje, że' parent :: current() 'zwróci obiekt' SplFileInfo' - ale może to być również ciąg znaków. Alternatywnie można pracować na samym 'RecursiveDirectoryIterator' i użyć' $ this-> getBasename() '(filtr dekoruje) lub' $ this-> getFilename() '. Tylko dodawanie. Dbanie o to, by konstruktor akceptował tylko "RecursiveDirectoryIterator", może być również pomocne przy pomocy '$ iterator'. Umieściłem trochę kodu w ukrytych plikach linux: ['HiddenFilesAndFolderFilterIterator.php'] (https://gist.github.com/hakre/11111534) – hakre

1

Dodaj warstwę filtrów między rekurencyjnymIteratorIliter i RekurencyjnyDirectoryIterator: Utwórz rekursywny filtrator i zakoduj funkcję accept(), która zwraca wartość prawda, jeśli chcesz, aby element był w wyniku. Umieść iterator katalogu w iteratorze filtru, wstaw iterator filtru do narzędzia RecursiveIteratorIterator. Powtarzać.

Nie ma predefiniowanej stałej SKIP dla takich specjalnych przypadków, jak katalogi "__MACOSX".