2012-05-15 89 views
6

我正在努力如何使用SPL迭代器在PHP中刪除空目錄樹。考慮其中所有的目錄都是空的目錄結構如下:PHP使用SPL迭代器遞歸刪除空目錄

/TOPDIR

level1 

     level2 

我已經試過如下:

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

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

RecursiveIteratorIterator::CHILD_FIRST防止底層文件從成爲循環的一部分,我得到標準的Directory not empty E_WARNING,因爲level1不是空的。

如何使用SPL迭代器遞歸地刪除空目錄樹?注意:我知道如何用glob,scandir等來做到這一點。請不要提供與解決方案類似的功能。

我覺得我必須失去了一些非常基本的在這裏...

+1

你確定所有這些目錄中包含沒有別的,但目錄? –

+0

好的,他們很可能是,我能用空目錄重現這個錯誤。 :) –

+0

是的。我已經創建了目錄結構作爲針對此問題的完整檢查。 – rdlowrey

回答

9

這是不實際的參觀兒童目錄的RecursiveIteratorIteratorRecursiveDirectoryIterator只提供它的句柄。

因此,你需要設置在RecursiveIteratorIterator的CHILD_FIRST標誌,而不是在RecursiveDirectoryIterator

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

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

爲了防止警告也::SKIP_DOTS標誌添加到RecursiveDirectoryIterator