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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Удаление директории со всем содержимым

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: это вопрос! :)
MoNSTRiK
Отправлено: 06 Июля, 2010 - 16:26:41
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Май 2009  


Помог: 0 раз(а)




Столкнулся с необходимостью удалять директории, которые содержат более 1000 файлов и сотню папок.

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

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

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

Может кто знает, как сделать быстро и без сильной загрузки сервера.
 
 Top
Uchkuma
Отправлено: 06 Июля, 2010 - 16:32:51
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




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. }
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 17:06:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Uchkuma В вашем приведенном PHP-скрипте в котором реализовано классическое рекурсивное удаление дерева папок есть два момента - во-первых закрытие ресурса директории должно происходить в шаге рекурсии то есть на одну скобку выше но это скорее опечатка Во-вторых более важным является вопрос о наличии оператора chmod - ведь для того чтобы можно было удалить файл из папки вовсе не обязательно быть его владельцем и тем более менять права на него - а достаточно лишь иметь права на запись в содержащую их директорию При практическом использовании этой фукнции скорее всего эффективный пользователь процесса не бдует совпадать с владельцем данной папки - по этой причине поменять права доступа на какие-то из используемых объектов не получится и будет сгенерировано множество предупрежнеий по этому поводу Другое дело что любая подпапка на самом деле не является элементом ее родительской папки а просто является определенным файловым путем - по этой причине права доступа на папки должны быть максимальными - или же для лучшего обеспечения безопасости использовать модуль suexec


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Champion Супермодератор
Отправлено: 06 Июля, 2010 - 18:21:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




выполнять chmod в скрипте которому может не хватать прав на это - забавное решение.
MoNSTRiKесли есть возможно сть сделать это из командной строки, то из-под пользователя с достаточными правами надо выполнить
rm -R dirname
 
 Top
JustUserR
Отправлено: 06 Июля, 2010 - 18:28:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Champion пишет:
Если есть возможно сть сделать это из командной строки, то из-под пользователя с достаточными правами надо выполнить
В этом случае хорошо если хостинг предоставляет возможности по переключению текущего пользователя с помощью утилит sudo или suexec - при этом такой подход является безопасным поскольку в их конфигурации можно указать каким процессам и между какими пользователями возможно менять соответствующий эффективный идентификатор


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
MoNSTRiK
Отправлено: 06 Июля, 2010 - 18:29:39
Post Id



Новичок


Покинул форум
Сообщений всего: 39
Дата рег-ции: Май 2009  


Помог: 0 раз(а)




Champion пишет:
rm -R dirname


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

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

Спасибо за ответ. Бум удалять через ОС Улыбка
 
 Top
Champion Супермодератор
Отправлено: 06 Июля, 2010 - 18:33:07
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Ну тогда Uchkuma написал подходящую функцию. Только замечания JustUsera надо в ней учесть.
 
 Top
ALEN
Отправлено: 06 Июля, 2010 - 18:44:29
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Лично у меня это выглядит так:
Использую подключение по по ftp, если не удаление не происходит с помощью php, удаляю с помощью ftp функций, естественно с перебором, сначала все файлы из папки, потом смотрю каталоги, если в каталогах, что-то есть то аналогично туда запускаю функцию, ну а в конце удаляется сам каталог.

P.S. Вообще для удобства в своей системе использую ftp функции для загрузки файлов - удобно потом по ftp все править. Да и права доступа файлов и папок меняю только на лету, т.к. это решает вопрос с ручной установкой прав доступа + безопасность.
 
 Top
Uchkuma
Отправлено: 06 Июля, 2010 - 20:26:05
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




JustUserR пишет:
вовсе не обязательно быть его владельцем и тем более менять права на него
Champion пишет:
выполнять chmod в скрипте которому может не хватать прав на это - забавное решение.
Действительно Радость . Сам в свое время нарыл этот скрипт из инета, и ведь он года 3 уже используется в моей CMS. Теперь вижу несуразицу.
 
 Top
JustUserR
Отправлено: 07 Июля, 2010 - 14:18:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




MoNSTRiK пишет:
Просил реализовать через CGI - но как это сделать я не в курсе. не работал никогда.
Вот думал что в пхп всё же есть функция удаления всего с содержимым
Лучшим вариатом для решения вашей задачи является использование обычного CGI-скрипта запускаемого при помощи модуля suexec или утилиты sudo - в таком случае вы будете работать от имени своего linux-пользователя а не www-data и получите улучшенную безопасность и точную возможность удалять свои файлы Во-первых если использовать такую форму запуска CGI-скриптов то можно для всех ваших ресурсов ограничиваться правами доступа 700 - ведь CGI-скрипт будет иметь доступ к нему так как его эффективный пользователь совпадает с владельцем файла а никто другой не будет иметь доступа Во-вторых вы заодно сможете удалть все файлы созданные web-сервером - по простой причине того вы являетесь владельцем домашней папки и можете удалять из нее что угодно


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB