2012-05-15 10 views
6

Non riesco a eliminare un albero di directory vuote in PHP utilizzando gli iteratori SPL. Si consideri la seguente struttura di directory in cui tutte le directory sono vuote:PHP Elimina in modo ricorsivo le directory vuote con gli iteratori SPL

/TOPDIR

level1 

     level2 

Ho provato la seguente:

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

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

Ma RecursiveIteratorIterator::CHILD_FIRST impedisce il file di livello più basso da parte del ciclo e ottengo lo standard Directory not empty E_WARNING perché level1 non è vuoto.

Come si elimina in modo ricorsivo un albero di directory vuote usando Iterator SPL? Nota: so come farlo con glob, scandir, ecc. Si prega di non offrire queste/simili funzioni come soluzioni.

Mi sento come se devo essere perso qualcosa molto elementare qui ...

+1

Sei sicuro che tutte queste directory contengono nient'altro che directory? –

+0

OK sì, sono probabili, sono stato in grado di riprodurre questo errore con la directory vuota. :) –

+0

Sì. Ho creato la struttura delle directory come controllo di integrità per questo problema. – rdlowrey

risposta

9

E 'il RecursiveIteratorIterator che fa l'attuale visita dei bambini-directory. Il RecursiveDirectoryIterator fornisce solo gli handle per esso.

Pertanto, è necessario impostare il flag CHILD_FIRST sulla RecursiveIteratorIterator e non sul RecursiveDirectoryIterator:

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

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

Per evitare avvertimenti anche aggiungere il flag ::SKIP_DOTS-RecursiveDirectoryIterator

Problemi correlati