php удалить каталог с файлами
Удалить каталог с файлами?
интересно, какой самый простой способ удалить каталог со всеми его файлами в нем?
30 ответов
есть по крайней мере два варианта, доступных в настоящее время.
перед удалением папки удалите все файлы и папки (и это означает рекурсию!). Вот пример:
и если вы используете 5.2+ вы можете использовать RecursiveIterator, чтобы сделать это без необходимости делать рекурсию себе:
обычно я использую это для удаления всех файлов в папке:
и тогда вы можете сделать
каков самый простой способ удалить каталог со всеми его файлами в нем?
короткая функция, которая выполняет эту работу:
Я использую его в классе Utils, как это:
С большой силой приходит большая ответственность: когда вы вызываете эту функцию с пустым значением, она удаляет файлы, начинающиеся с root ( / ). В качестве гарантии вы можете проверить, пуст ли путь:
это более короткая версия отлично работает для меня
как видно из большинства проголосовавших комментариев на странице руководства PHP о rmdir() (см. http://php.net/manual/es/function.rmdir.php), glob() функция не возвращает скрытые файлы. scandir() в качестве альтернативы, которая решает этот вопрос.
алгоритм, описанный там (который работал как шарм в моем случае):
здесь у вас есть одна хорошая и простая рекурсия для удаления всех файлов в исходном каталоге, включая этот каталог:
функция основана на рекурсии, сделанной для копирования каталога. Вы можете найти эту функцию здесь: скопируйте все содержимое каталога в другой с помощью php
вы можете использовать Symfony это файловой системы (код):
однако я не мог удалить некоторые сложные структуры каталогов с помощью этого метода, поэтому сначала вы должны попробовать его, чтобы убедиться, что он работает правильно.
Я мог бы удалить указанную структуру каталогов, используя конкретную реализацию Windows:
И просто для полноты, вот мой старый код:
Я предпочитаю это, потому что он по-прежнему возвращает TRUE, когда он преуспевает, и FALSE, когда он терпит неудачу, а также предотвращает ошибку, когда пустой путь может попытаться удалить все из»/*».
Как удалить все файлы из папки с помощью PHP?
У меня большое количество посетителей в день и создаётся до 50 тысяч сессий в день. Пишу скрипт, чтобы когда число сессий в папке mod-tmp превысит 20 тысяч, сервер удалял бы из неё все файлы и перезагружался. Помогите, пожалуйста, как с помощью PHP удалить все файлы из 1 папки?
7 ответов 7
Вот самый быстрый и лёгкий способ:
Удалить средствами php сразу все не получится. Только в цикле. Возможно следует посмотреть в сторону демонов, как сказал @Inart.
Код для пхп:
Грубый подход, очень грубый:
Это сработает только в Linux. Еще раз скажу, подход очень грубый и лучше такого не использовать НИКОГДА.
Вероятно, всё намного проще. ISPManager криво меняет конфиг php отключая сборщик мусора сессий.
Открывайте конфиг php. По-дефолту /etc/php.d/apache/php.ini
Меняйте параметр session.gc_probability=0 в значение 1
Перезапускаете аппач /etc/init.d/apache2 restart
Всё, сборка мусора снова — дело php.
Удаление директории в PHP
Доброго времени суток, дорогие читатели. Сегодня хотелось бы поговорить на тему удаления директории в PHP. Казалось бы, что операция не является сложной, однако некоторые нюансы имеют место быть. Давайте рассмотрим способы, как можно это сделать.
В PHP для этого предусмотрена функция rmdir(). В качестве аргумента она принимает путь до директории, которую Вы хотите удалить. Однако, директория должна быть пустая — это главное условие (если не считать того, что у пользователя, от которого работает веб-сервер, должны быть права на запись для директории). Если в директории будут размещены файлы, то мы получим ошибку при вызове функции. Соответственно, приходим к выводу, что директорию перед использованием функции rmdir() необходимо предварительно очистить.
В сети советуют написать функцию, которой в качестве аргумента будет передаваться путь к директории, которую нам необходимо удалить. В теле функции необходимо организовать листинг содержимого директории, в рамках которого осуществляется проверка — является ли файл директорией. Если файл является директорией, то по данному условию функция вызывает себя. Это необходимо для зачистки вложенных директорий, и это будет работать на всех уровнях вложенности. В ином случае, для файла применяется функция unlink() — она предназначена для удаления файла. За рамками данной проверки на последнем шаге мы удаляем директорию.
Пример реализации:
Какие проблемы у данного кода?
В итоге, функция обретает следующий вид:
Код рабочий, но на самом деле можно было сделать и проще. В PHP существует класс FilesystemIterator, который уже по умолчанию имеет необходимые нам настройки. В конструктор передается путь до директории, листинг которой нам нужен. Нам достаточно просто создать объект.
В заключение хотелось бы отметить еще один быстрый способ. Корректность его использования весьма сомнительна — отправить команду на выполнение в SHELL.
Обращаю внимание на высокий расход памяти и на то, что зачастую администраторы запрещают использовать на сервере такого рода функции в целях безопасности.
Удаление каталога с файлами в PHP
В предыдущей статье мы с Вами разбирали функции для работы с каталогами в PHP, и там я познакомил Вас с функцией rmdir(), которая удаляет каталог. Однако, я сказал, что таким способом получится удалить только пустую директорию, а вот как удалить каталог с файлами, Вы узнаете сейчас.
Несмотря на кажущуюся сложность алгоритма, реализация очень простая и прозрачная:
Постараюсь объяснить понятным языком алгоритм работы данной функции. Первым делом мы получаем список всех файлов внутри заданной директории. Если их там нет, то сразу удаляем её. Если они есть, то начинаем по-очереди перебирать. Если элемент является файлом, то просто удаляем его (unlink($obj)). Если же это каталог, то вызываем вновь нашу функцию, передав этот каталог. Это и есть рекурсия: функция вызывает сама себя. После вызова функцией самой себя всё начинается заново, но уже с другой директорией. У ней также удаляются все файлы, а все её директории отправляются вновь в эту функцию. Когда все директории и файлы удалены, у нас удаляется уже пустой каталог.
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 8 ):
Михаил подскажите как удалить в папке несколько файлов png. Я пол дня провел над этой задачей. Прошу подсказать ))) Очень нужно.
Получаете список файлов из каталога и удаляете их в цикле через unlink().
rmdir
(PHP 4, PHP 5, PHP 7, PHP 8)
rmdir — Удаляет директорию
Описание
Список параметров
Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Примеры
Пример #1 Пример использования rmdir()
if (! is_dir ( ‘examples’ )) <
mkdir ( ‘examples’ );
>
Смотрите также
User Contributed Notes 29 notes
Glob function doesn’t return the hidden files, therefore scandir can be more useful, when trying to delete recursively a tree.
Never ever use jurchiks101 at gmail dot com code. It contains command injection vulnerability.
If you want to do it that way, use something like this instead:
some implementations of recursive folder delete don’t work so well (some give warnings, other don’t delete hidden files etc).
Thanks to itay for the original function, though, it was helpful.
Say, you’re working on Windows and continue to get a permission’s error without a reason. Then it may be that a different Windows program is working on the folder (see earlier notes also). In the case that you can’t find that program, the line
I was working on some Dataoperation, and just wanted to share an OOP method with you.
It just removes any contents of a Directory but not the target Directory itself! Its really nice if you want to clean a BackupDirectory or Log.
Also you can test on it if something went wrong or if it just done its Work!
I have it in a FileHandler class for example, enjoy!
Another simple way to recursively delete a directory that is not empty:
This issue has been driving me nuts for hours.
I am running PHP on IIS, I had the wincache module installed, when running a recursive delete a certain folder would get «stuck» and throw permissions errors. I was not able to delete them with PHP or in windows itself. The only way to delete the folder was to wait 5 min and run the script again, or stop the IIS server and the folder would delete on its own. Disabling the wincachce module resolved the issue.
it Will Delete All Fildes in folder and that folder too.
It is rather dangerous to recurse into symbolically linked directories. The delTree should be modified to check for links.
Keep in mind that if you know what your host OS is, you can always just call the appropriate system call using exec() or the like. For example:
I’ve noticed that when using this command on a windows platform you may encounter a permissions error which may seem unwarranted. This commonly occurs if you are or were using a program to edit something in the to be deleted folder and either the item is still in the folder or the program that was accessing the file in that folder is still running(causing it to hold onto the folder).
SO. if you get a permissions error and there shouldn’t be an issue with folder permissions check if there are files in there then check if there is a program running that is or was using a file that was in that folder and kill it.
Function deleteAll given by O S on 18-Jun-2010 11:30 will fail at line
while ($contents = readdir($directoryHandle)) <.
if a folder named 0 (zero) is found during traversing the hierarchy
A patch to previous script to make sure rights for deletion is set:
if you get this problem Permission denied in windows testing your site maybe this will resolve the problem
I wasn’t having much luck with the recursive delete functions below, so I wrote my own:
This isn’t my code, but just thought I would share, since it took me so long to find. This is a function to delete a folder, all sub-folders, and files in one clean move.
// Recursive PHP function to completely remove a directory
> // end of iteration through directories / files of provided path
> // end of delete_directory_recursively() function definition
Concise way to recursively remove a directory:
I had situation where the rmdir was returning warning message as within last loop it was already removed. So here is quick fix by adding is_dir to the DelTree routine below
This version delete tree
//This is one example to delete full directory with all files inside there