2009-08-18 1 views
32

Функция rmdir() не работает, если папка содержит любые файлы. Я могу перебрать все файлы в каталоге с чем-то вроде этого:PHP: Самый простой способ удалить папку (включая ее содержимое)

foreach (scandir($dir) as $item) { 
    if ($item == '.' || $item == '..') continue; 
    unlink($dir.DIRECTORY_SEPARATOR.$item); 
} 
rmdir($dir); 

Есть ли способ, чтобы просто удалить все сразу?

ответ

47

Ну, всегда есть

system('/bin/rm -rf ' . escapeshellarg($dir)); 

, где доступны.

+8

Но это не будет работать на сервере Windows. – Raza

+4

@ KashifRaza: Верно. Следовательно, «где доступно». – chaos

+0

В Windows это использует: system ('rd/Q/S "'. $ Dir. '"'); – ddelrio1986

2

Согласно this источник;

Сохраните некоторое время, если вы хотите очистить каталог или удалить его, и вы находитесь в окнах.

Использование Это:

chdir ($file_system_path); 
    exec ("del *.* /s /q"); 

Вы можете использовать другой синтаксис DEL, или любой другой оболочки Util. Возможно, вам придется разрешить службе взаимодействовать с рабочим столом, так как это моя текущая настройка, и я не меняю ее, чтобы проверить это.

Иначе вы могли бы найти альтернативный метод here.

+0

Плохая идея - зависеть от вашей ОС ... это работает только в Windows и, например, не работает в системе Unix ... – patrick

59

rrmdir() - рекурсивно удалить каталоги:

function rrmdir($dir) { 
    foreach(glob($dir . '/*') as $file) { 
    if(is_dir($file)) rrmdir($file); else unlink($file); 
    } rmdir($dir); 
} 
+9

Я однажды удалю весь проект, используя такую ​​функцию, будьте осторожны! – gskema

+2

@gskema, Ваш комментарий заставил меня смеяться !!! Я могу только представить момент «ohhhh shhiiiiittttt». Надеюсь, ты все вернул! – silversunhunter

+3

@silversunhunter На самом деле, я этого не делал. Когда 'unlink' удаляет что-то, это значит. Хорошо, что это всего лишь тестовый проект. Урок дня: используйте удаленный VCS – gskema

1

Попробуйте это:

 
exec('rm -rf '.$user_dir); 
+5

никогда! вы должны esape $ user_dir! добавьте escapeshellarg ($ user_dir) –

+0

Вы с ума сошли? – BadHorsie

+0

небезопасно и хуже: зависит от вашей ОС ... это может произойти, например, в системе Windows ... – patrick

3
function delete_files($dir) { 
    if (is_dir($dir)) { 
    $objects = scandir($dir); 
    foreach ($objects as $object) { 
     if ($object != "." && $object != "..") { 
     if (filetype($dir."/".$object) == "dir") 
      delete_files($dir."/".$object); 
     else unlink ($dir."/".$object); 
     } 
    } 
    reset($objects); 
    rmdir($dir); 
    } 
} 
1

Это фикцию удалить каталог и все подкаталогов и файлов:

function DelDir($target) { 
    if(is_dir($target)) { 
     $files = glob($target . '*', GLOB_MARK); //GLOB_MARK adds a slash to directories returned 

     foreach($files as $file) 
     { 
      DelDir($file);  
     } 

     rmdir($target); 
    } elseif(is_file($target)) { 
     unlink($target); 
    } 
} 
0

Одним из надежных и хорошая функция находится в PHP комментарии по lprent Это предотвращает случайное удаление содержимого символических ссылок каталогов, расположенных в текущем каталоге

public static function delTree($dir) { 
    $files = array_diff(scandir($dir), array('.','..')); 
    foreach ($files as $file) { 
     (is_dir("$dir/$file") && !is_link($dir)) ? delTree("$dir/$file") : unlink("$dir/$file"); 
    } 
    return rmdir($dir); 
    }