Удаление содержимого каталога и содержимого подкаталога

Я настроил PHP для удаления каталога, его содержимого и любого подкаталога и его содержимого ... Я новичок в PHP, поэтому я определенно что-то делаю НЕПРАВИЛЬНО или делаю что-то неэффективным способом.

Ищете ссылки или предложения о том, как сделать это лучше ...

Кстати, этот код работает нормально. Использование PHP 5.3.8.

chmod($main_dir, 0755);
if ($handle = opendir($main_dir)) {
    while (false !== ($entry = readdir($handle))) { 
        $absolute_path = $main_dir.'/'.$entry;
        if ($entry != "." && $entry != "..") {      
            chmod($absolute_path, 0755);
            unlink($absolute_path);

            //check if any folders exist, then delete files within
            if (file_exists($absolute_path) && is_dir($absolute_path)) {
                if ($child_handle = opendir($absolute_path)) {
                    while (false !== ($child_entry = readdir($child_handle))) {             
                    $child_absolute_path = $absolute_path.'/'.$child_entry;
                        if ($child_entry != "." && $child_entry != "..") {              
                            chmod($child_absolute_path, 0755);
                            unlink($child_absolute_path);
                        }
                    }
                    closedir($child_handle);
                }
            }
            rmdir($absolute_path);
        }
    }
    closedir($handle);
}
rmdir($main_dir);

есть идеи? Очень признателен! Я использую PHP 5.3.8

 noel19 окт. 2012 г., 03:50
Это может быть более уместным наобзор кода
 Terry19 окт. 2012 г., 03:53
@shakabra Спасибо, сейчас все проверим ...

Ответы на вопрос(1)

Решение Вопроса

Вы можете использоватьRecursiveDirectoryIterator перечислить все файлы и папки, а затем удалить их. Обратите внимание, что вы должны использоватьRecursiveIteratorIterator::CHILD_FIRST так что файлы удаляются перед папкой.

$dir = __DIR__ . "/test";
$di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
$ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST);
foreach ( $ri as $file ) {
    $file->isDir() ?  rmdir($file) : unlink($file);
}
 Baba19 окт. 2012 г., 13:07
@ Терри обучение продолжается ... Я рад, что смог помочь
 Terry19 окт. 2012 г., 04:58
ВАУ, намного проще ... Спасибо! Занимался чтением на php.net, жаль, что я не знал о RecursiveDirectoryIterator давным-давно.

Ваш ответ на вопрос