Удаление каталога с файлами в PHP
В предыдущей статье мы с Вами разбирали функции для работы с каталогами в PHP, и там я познакомил Вас с функцией rmdir(), которая удаляет каталог. Однако, я сказал, что таким способом получится удалить только пустую директорию, а вот как удалить каталог с файлами, Вы узнаете сейчас.
Принцип очень простой: чтобы удалить каталог с файлами, надо удалить сначала все файлы, а также все подкаталоги. Внутри подкаталогов могут быть также файлы и другие подкаталоги, их также надо очистить. В общем, сложность состоит в том, что глубина каталогов может быть очень большой. И очевидно, что напрашивается рекурсия - вызов функции внутри самой себя.
Несмотря на кажущуюся сложность алгоритма, реализация очень простая и прозрачная:
<?php
function removeDirectory($dir) {
if ($objs = glob($dir."/*")) {
foreach($objs as $obj) {
is_dir($obj) ? removeDirectory($obj) : unlink($obj);
}
}
rmdir($dir);
}
?>
Постараюсь объяснить понятным языком алгоритм работы данной функции. Первым делом мы получаем список всех файлов внутри заданной директории. Если их там нет, то сразу удаляем её. Если они есть, то начинаем по-очереди перебирать. Если элемент является файлом, то просто удаляем его (unlink($obj)). Если же это каталог, то вызываем вновь нашу функцию, передав этот каталог. Это и есть рекурсия: функция вызывает сама себя. После вызова функцией самой себя всё начинается заново, но уже с другой директорией. У ней также удаляются все файлы, а все её директории отправляются вновь в эту функцию. Когда все директории и файлы удалены, у нас удаляется уже пустой каталог.
Я Вам скажу так, данный алгоритм не столько полезен с точки зрения практики (не так часто приходится удалять каталоги с файлами в PHP), сколько полезен для развития Вашего мышления. Это очень простой алгоритм и решает он весьма и весьма сложную задачу. Поэтому учитесь составлять алгоритмы - это самое главное в любом языке программирования.
-
- Михаил Русаков
Комментарии (8):
Михаил подскажите как удалить в папке несколько файлов png. Я пол дня провел над этой задачей. Прошу подсказать ))) Очень нужно.
Ответить
Получаете список файлов из каталога и удаляете их в цикле через unlink().
Ответить
<?php $path = "temp_path"; $mask = "file_mask" $flist = glob($path.$mask); foreach($flist as $fname) unlink($fname); ?> <br> http://blog.aaa-nan.info/2009/08/php-script.html
Ответить
Михаил, читаю ваши уроки с самого начала и не смог обнаружить у вас пояснения двух знаков, и их применение - ? : ; Например тут is_dir($obj) ? removeDirectory($obj) : unlink($obj); И что такое is_dir()?
Ответить
Подобная запись является аналогом цикла if и оформляется по такой форме: Условие ? Выражение1 : Выражение2 Выражение1 выполнится если Условие истино, Выражение2 если ложно, т.е. else. Например: $x>=$y ? echo("Икс больше либо равен игрику") : echo(Икс меньше игрика); равносильно if($x>=$y) { echo("Икс больше либо равен игрику"); } else { echo("Икс меньше игрика"); }
Ответить
А как быть если в директории лежит .htaccess?
Ответить
Можно попробовать так: $dir = 'uploads/'; $files = scandir($dir,1); foreach ($files as $item) { if($item == '.htaccess' OR $item == '.' OR $item == '..'){ /*Ничего не делаем*/ }else{ /*Удаляем*/ unlink('uploads/'.$item); echo 'Удалено'; } }
Ответить
Сделал так: function delFolder($dir) { $files = scandir( $dir ); foreach( $files as $file ) { if ( in_array( $file, array( "..", "." ) )) continue; else ( is_dir( "$dir/$file" )) ? delFolder( "$dir/$file" ) : unlink( "$dir/$file" ); } rmdir ( $dir ); }
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.