2012-05-15 6 views
6

Mam problem z usuwaniem drzewa pustych katalogów w PHP za pomocą iteratorów SPL. Rozważmy następującą strukturę katalogów, w którym wszystkie katalogi są puste:PHP Rekursywnie usuwaj puste katalogi z iteratorami SPL

/topdir

level1 

     level2 

Próbowałem następujące:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(
    '/topdir', RecursiveIteratorIterator::CHILD_FIRST 
)); 

foreach ($it as $file) { 
    if ($file->isDir()) { 
     rmdir((string)$file); 
    } 
} 

Ale RecursiveIteratorIterator::CHILD_FIRST zapobiega plik dolny poziom od bycia częścią pętli i otrzymuję standard Directory not empty E_WARNING, ponieważ level1 nie jest pusty.

Jak mogę rekursywnie usunąć drzewo pustych katalogów za pomocą Iterator SPL? Uwaga: wiem, jak to zrobić z glob, scandir itd. Nie oferuj tych/podobnych funkcji jako rozwiązań.

czuję, że musi być brakuje czegoś bardzo elementarną tutaj ...

+1

Czy jesteś pewien, że wszystkie te katalogi zawierają nic więcej poza katalogami? –

+0

OK, tak, prawdopodobnie są w stanie odtworzyć ten błąd pustym katalogiem. :) –

+0

Tak. Stworzyłem strukturę katalogów jako kontrolę poprawności specjalnie dla tego problemu. – rdlowrey

Odpowiedz

9

To RecursiveIteratorIterator że robi rzeczywisty odwiedzenie dziecka katalogach. RecursiveDirectoryIterator zapewnia tylko uchwyty do niego.

Dlatego trzeba ustawić flagę CHILD_FIRST na RecursiveIteratorIterator a nie na RecursiveDirectoryIterator:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('/topdir', FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST 
); 

foreach ($it as $file) { 
    if ($file->isDir()) { 
     rmdir((string)$file); 
    } 
} 

Aby uniknąć ostrzeżenia również dodać flagę ::SKIP_DOTS do RecursiveDirectoryIterator

Powiązane problemy