2009-08-18 9 views
32

La función rmdir() falla si la carpeta contiene algún archivo. Que pueda recorrer todos los archivos en el directorio con algo como esto:PHP: forma más sencilla de eliminar una carpeta (incluido su contenido)

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

¿Hay alguna manera de simplemente borrar todo de una vez?

Respuesta

47

Bueno, siempre hay

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

donde esté disponible.

+8

Pero esto no va a funcionar en el servidor Windows. – Raza

+4

@KashifRaza: Correcto. De ahí "donde esté disponible". – chaos

+0

En Windows use esto: system ('rd/Q/S "'. $ Dir. '"'); – ddelrio1986

2

Según this fuente;

Ahorre tiempo, si quiere limpiar un directorio o eliminarlo y está en Windows.

Usar este:

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

Se pueden usar otras sintaxis DEL o cualquier otro util cáscara. Es posible que deba permitir que el servicio interactúe con el escritorio, ya que esa es mi configuración actual y no la cambiaré para probar esto.

otra cosa que podría encontrar un método alternativo here.

+0

es una mala idea tener que depender de su sistema operativo ... esto solo funciona en Windows y podría fallar en un sistema Unix, por ejemplo ... – patrick

59

rrmdir() - recursiva eliminar directorios:

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

Una vez eliminé todo mi proyecto usando tal función, ¡tenga cuidado! – gskema

+2

@gskema, ¡Tu comentario me hizo reír! Solo puedo imaginar el momento "ohhhh shhiiiiittttt". ¡Espero que lo hayas recuperado todo! – silversunhunter

+3

@silversunhunter En realidad, no lo hice. Cuando 'unlink' borra algo, lo significa. Lo bueno es que solo fue un proyecto de prueba. Lección del día: uso un VCS remoto – gskema

1

Prueba esto:

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

¡Nunca! debes esape $ user_dir! por favor, agrega escapeshellarg ($ user_dir) –

+0

¿Estás loco? – BadHorsie

+0

inseguro y peor: depende de su sistema operativo ... esto podría fallar en un sistema de Windows, por ejemplo ... – 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

Este fuction eliminar el directorio y todos subdirectorios y archivos:

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

Una de las funciones de seguridad y buen situado en los comentarios php por lprent Se evita el borrado accidental de los contenidos de los directorios de enlaces simbólicos ubicados en el directorio actual

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); 
    } 
Cuestiones relacionadas