2009-08-26 13 views
27

Necesito eliminar una carpeta con contenido usando PHP. rmdir() y unlink() eliminan las carpetas vacías, pero no pueden eliminar las carpetas que tienen contenido.Cómo eliminar una carpeta con contenido usando PHP

+6

@@ Maerlyn: He publicado esta pregunta el 26 de agosto de 2009. El duplicado, que usted ha mencionado fue publicado el 28 de julio de 2010 ... Creo que ya sabes qué hacer AHORA ... Antes de hacer algo, por favor revisa una vez. – Fero

Respuesta

80

Esta función le permite eliminar cualquier carpeta (siempre y cuando sea grabable) y es archivos y subdirectorios.

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = array_diff(scandir($path), array('.', '..')); 

     foreach ($files as $file) 
     { 
      Delete(realpath($path) . '/' . $file); 
     } 

     return rmdir($path); 
    } 

    else if (is_file($path) === true) 
    { 
     return unlink($path); 
    } 

    return false; 
} 

o sin el uso de la recursividad RecursiveDirectoryIterator:

function Delete($path) 
{ 
    if (is_dir($path) === true) 
    { 
     $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); 

     foreach ($files as $file) 
     { 
      if (in_array($file->getBasename(), array('.', '..')) !== true) 
      { 
       if ($file->isDir() === true) 
       { 
        rmdir($file->getPathName()); 
       } 

       else if (($file->isFile() === true) || ($file->isLink() === true)) 
       { 
        unlink($file->getPathname()); 
       } 
      } 
     } 

     return rmdir($path); 
    } 

    else if ((is_file($path) === true) || (is_link($path) === true)) 
    { 
     return unlink($path); 
    } 

    return false; 
} 
+2

Gran método, hombre . Estaba usando el comando más simple: , pero lamentablemente algunos servidores no permiten el comando del sistema, por lo que el suyo (elegí el primero) es una sustitución muy buena y simple. Gracias hermano. –

+1

¿Esto también funciona para rutas relativas? Entonces, digamos que la ruta completa es "/ var/www/html/folder_and_files_to_delete /" Y el script de eliminación se ubica en "/var/www/html/delete_folders_and_files.php". ¿Puedo simplemente tomar "folder_and_files_to_delete" como ruta? – yoano

+0

Me gusta, la mejor respuesta – mghhgm

0

Siempre se puede engañar y hacer shell_exec("rm -rf /path/to/folder");

+2

A menos que esté en Windows :) –

+0

No se recomienda en absoluto para la producción. – Volomike

+2

@Volomike: ¿Por qué? Esto es casi seguro más rápido que una solución de php. – ryeguy

1

Usted tendrá que eliminar todos los archivos de forma recursiva. Hay funciones de ejemplo de la abundancia en los comentarios de la página de manual de rmdir:

http://www.php.net/rmdir

+0

espero que rmdir elimine solo la carpeta que no tiene contenido. si tiene contenido, no eliminará la carpeta. – Fero

+0

Eso es exactamente Fero - rmdir no eliminará un directorio que tenga contenido, por lo que primero debe eliminar cualquier contenido si desea deshacerse de un directorio (incluido el contenido de cualquier subdirectorio) – Fenton

1

No existe una función única a construir en PHP que permitiría a esto, se tiene que escribir su propia con rmdir y desvincular.

Un ejemplo (tomado de un comentario en php.net docs):

<? 
// ensure $dir ends with a slash 
function delTree($dir) { 
    $files = glob($dir . '*', GLOB_MARK); 
    foreach($files as $file){ 
     if(substr($file, -1) == '/') 
      delTree($file); 
     else 
      unlink($file); 
    } 
    rmdir($dir); 
} 
?> 
+1

¿Qué es GLOB_MARK? – Randell

+0

@Randell: GLOB_MARK - Agrega una barra inclinada a cada directorio devuelto. –

3

Aquí hay un script que va a hacer todo lo que necesita:

/** 
* Recursively delete a directory 
* 
* @param string $dir Directory name 
* @param boolean $deleteRootToo Delete specified top-level directory as well 
*/ 
function unlinkRecursive($dir, $deleteRootToo) 
{ 
    if(!$dh = @opendir($dir)) 
    { 
     return; 
    } 
    while (false !== ($obj = readdir($dh))) 
    { 
     if($obj == '.' || $obj == '..') 
     { 
      continue; 
     } 

     if ([email protected]($dir . '/' . $obj)) 
     { 
      unlinkRecursive($dir.'/'.$obj, true); 
     } 
    } 

    closedir($dh); 

    if ($deleteRootToo) 
    { 
     @rmdir($dir); 
    } 

    return; 
} 

Me lo dio php.net y funciona .

-3

Quizás un mejor enfoque es usar rm (si está en linux). Sería algo parecido a esto ($root debe estar siempre a su TMP directory para evitar la eliminación de archivos vitales!):

function remove($dir) { 

    $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; 

    if (is_dir($root.$dir)) { 

     exec('rm -rf '.$root.$dir); 

    } 

} 
+4

remove ("/") ... hará feliz a todos :) –

+3

Yikes. Los comandos de Shell deben ser evitados. – Volomike

+1

ELIMINAR ARCHIVOS COMO ESTE EN UNA APLICACIÓN WEB DEBE SER EVITADO. DAR RUTA RELATIVA PUEDE ELIMINAR CUALQUIER ARCHIVO EN EL SISTEMA SI LA APLICACIÓN DEL USUARIO TIENE PERMISO. – ArunaFromLK

Cuestiones relacionadas