Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Удаление директории со всем содержимым
Форумы портала PHP.SU » PHP » Программирование на PHP » Удаление директории со всем содержимым

Страниц (1): [1]
 

1. MoNSTRiK - 06 Июля, 2010 - 16:26:41 - перейти к сообщению
Столкнулся с необходимостью удалять директории, которые содержат более 1000 файлов и сотню папок.

хотел воспользоваться "rmdir", но в описании было сказано "Директория должна быть пустой и должны иметься необходимые для этого права."

Ударился в поиски и функции рекурсивного удаления, увы не нашёл.

если писать класс, который будет удалять каждый файл и категорию поэтапно - это не подходит. Так как по БД будет много таких директорий с большим объёмом.

Может кто знает, как сделать быстро и без сильной загрузки сервера.
2. Uchkuma - 06 Июля, 2010 - 16:32:51 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. function RemoveDir($path){
  2. if(file_exists($path) && is_dir($path)){
  3. $dirHandle = opendir($path);
  4. while(false!==($file = readdir($dirHandle))){
  5. if($file!='.' && $file!='..'){
  6. $tmpPath = $path.'/'.$file;
  7. chmod($tmpPath, 0777);
  8. if(is_dir($tmpPath)){
  9. RemoveDir($tmpPath);
  10. } else {
  11. if(!unlink($tmpPath)) echo 'Не удалось удалить файл «'.$path.'»!';
  12. }
  13. }
  14. }
  15. closedir($dirHandle);
  16.  
  17. // удаляем текущую папку
  18. if(!rmdir($path)) echo 'error', 'Не удалось удалить папку «'.$path.'»!';
  19.  
  20. } else {
  21. echo 'error', 'Папки «'.$path.'» не существует!';
  22. }
  23. }
3. JustUserR - 06 Июля, 2010 - 17:06:01 - перейти к сообщению
Uchkuma В вашем приведенном PHP-скрипте в котором реализовано классическое рекурсивное удаление дерева папок есть два момента - во-первых закрытие ресурса директории должно происходить в шаге рекурсии то есть на одну скобку выше но это скорее опечатка Во-вторых более важным является вопрос о наличии оператора chmod - ведь для того чтобы можно было удалить файл из папки вовсе не обязательно быть его владельцем и тем более менять права на него - а достаточно лишь иметь права на запись в содержащую их директорию При практическом использовании этой фукнции скорее всего эффективный пользователь процесса не бдует совпадать с владельцем данной папки - по этой причине поменять права доступа на какие-то из используемых объектов не получится и будет сгенерировано множество предупрежнеий по этому поводу Другое дело что любая подпапка на самом деле не является элементом ее родительской папки а просто является определенным файловым путем - по этой причине права доступа на папки должны быть максимальными - или же для лучшего обеспечения безопасости использовать модуль suexec
4. Champion - 06 Июля, 2010 - 18:21:09 - перейти к сообщению
выполнять chmod в скрипте которому может не хватать прав на это - забавное решение.
MoNSTRiKесли есть возможно сть сделать это из командной строки, то из-под пользователя с достаточными правами надо выполнить
rm -R dirname
5. JustUserR - 06 Июля, 2010 - 18:28:15 - перейти к сообщению
Champion пишет:
Если есть возможно сть сделать это из командной строки, то из-под пользователя с достаточными правами надо выполнить
В этом случае хорошо если хостинг предоставляет возможности по переключению текущего пользователя с помощью утилит sudo или suexec - при этом такой подход является безопасным поскольку в их конфигурации можно указать каким процессам и между какими пользователями возможно менять соответствующий эффективный идентификатор
6. MoNSTRiK - 06 Июля, 2010 - 18:29:39 - перейти к сообщению
Champion пишет:
rm -R dirname


Наш админ говорит, что лучше не делать ни каких прямых обращений из апача к Линуксу.

Просил реализовать через CGI - но как это сделать я не в курсе. не работал никогда.
Вот думал что в пхп всё же есть функция удаления всего с содержимым Улыбка

Спасибо за ответ. Бум удалять через ОС Улыбка
7. Champion - 06 Июля, 2010 - 18:33:07 - перейти к сообщению
Ну тогда Uchkuma написал подходящую функцию. Только замечания JustUsera надо в ней учесть.
8. ALEN - 06 Июля, 2010 - 18:44:29 - перейти к сообщению
Лично у меня это выглядит так:
Использую подключение по по ftp, если не удаление не происходит с помощью php, удаляю с помощью ftp функций, естественно с перебором, сначала все файлы из папки, потом смотрю каталоги, если в каталогах, что-то есть то аналогично туда запускаю функцию, ну а в конце удаляется сам каталог.

P.S. Вообще для удобства в своей системе использую ftp функции для загрузки файлов - удобно потом по ftp все править. Да и права доступа файлов и папок меняю только на лету, т.к. это решает вопрос с ручной установкой прав доступа + безопасность.
9. Uchkuma - 06 Июля, 2010 - 20:26:05 - перейти к сообщению
JustUserR пишет:
вовсе не обязательно быть его владельцем и тем более менять права на него
Champion пишет:
выполнять chmod в скрипте которому может не хватать прав на это - забавное решение.
Действительно Радость . Сам в свое время нарыл этот скрипт из инета, и ведь он года 3 уже используется в моей CMS. Теперь вижу несуразицу.
10. JustUserR - 07 Июля, 2010 - 14:18:52 - перейти к сообщению
MoNSTRiK пишет:
Просил реализовать через CGI - но как это сделать я не в курсе. не работал никогда.
Вот думал что в пхп всё же есть функция удаления всего с содержимым
Лучшим вариатом для решения вашей задачи является использование обычного CGI-скрипта запускаемого при помощи модуля suexec или утилиты sudo - в таком случае вы будете работать от имени своего linux-пользователя а не www-data и получите улучшенную безопасность и точную возможность удалять свои файлы Во-первых если использовать такую форму запуска CGI-скриптов то можно для всех ваших ресурсов ограничиваться правами доступа 700 - ведь CGI-скрипт будет иметь доступ к нему так как его эффективный пользователь совпадает с владельцем файла а никто другой не будет иметь доступа Во-вторых вы заодно сможете удалть все файлы созданные web-сервером - по простой причине того вы являетесь владельцем домашней папки и можете удалять из нее что угодно

 

Powered by ExBB FM 1.0 RC1