PHP: Eliminar directorio y contenido

Muchas veces necesitamos eliminar un directorio, y PHP nos permite utilizar la función rmdir() el único problema es que pone como condición que el directorio esté vacio.

Si no es nuestro caso y queremos borrar todo un directorio independientemente de lo que contenga, podremos hacer uso de esta función recursiva que he creado.

 

<?php
function eliminarDir($carpeta)
{
    foreach(glob($carpeta . "/*") as $archivos_carpeta)
    {
        echo $archivos_carpeta;
 
        if (is_dir($archivos_carpeta))
        {
            eliminarDir($archivos_carpeta);
        }
        else
        {
            unlink($archivos_carpeta);
        }
    }
 
    rmdir($carpeta);
}
?>

 

 

Como se puede observar, después de obtener todos lo elementos del directorio raíz, elimino los archivos y voy pasando de manera recursiva a todos los subdirectorios.

Y recordad que si quereis contar con nosotros para realizar vuestra página web podeis poneros en contacto con nosotros en:

www.freshware.es

43 comentarios en “PHP: Eliminar directorio y contenido

    • Muy buenas,
      $carpeta debe ser un string que contenga el nombre de la carpeta que se desea eliminar.

      Tienes otro ejemplo en nuestro post http://blog.freshware.es/mostrar-archivos-de-un-directorio-con-php/.
      En ambos códigos para usarlos solo le tienes que pasar un string, ya sea que la variable es el nombre de la carpeta a eliminar, o que se lo pongas directamente en la función.

      La primera forma:
      < ?php $carpeta = 'carpeta_para_borrar'; eliminarDir($carpeta); ?>

      La segunda forma:
      < ?php eliminarDir('carpeta_para_borrar'); ?>

      Espero que te haya servido para entenderlo.

      Muchas gracias por leernos!

      Un saludo!!

      Fran.

    • Hola Jeyson,
      Claro que si tienes que poner la dirección. Pero ésta la puedes poner de muchas formas.

      Imagínate que tienes que el archivo con el código que permite borrar, dentro de una carpeta llamada “prueba”. Y dentro de esta otra carpeta que se llama “borrar”.
      La estructura sería esta:

      /prueba/
      |
      |—- codigo.php
      |
      |—-/borrar/

      Ahora queréis borrar la carpeta llamada “borrar”.

      Para hacerlo, le tenéis que pasar a la función que está dentro de “codigo.php” la ruta de esa carpeta y el nombre de la misma.
      El modo correcto de hacerlo seria:

      < ?php $carpeta = './borrar'; eliminarDir($carpeta); ?>

      O también

      < ?php eliminarDir('./borrar'); ?>

      Espero haberte aclarado tu duda ;D

      Un saludo,

      Fran.

  • saludos,

    aunque apartándome un poquito del tema,
    lo que quiero preguntar es con respecto a subir archivos.
    se puede seleccionar una carpeta y subir todo su contenido?

    las carpetas que quiero subir tendrá unas 5 a 7 fotos y unos cuantos txt.

    • Muy buenas,
      Para subir un archivo puedes usar un código de este tipo:

      HTML





      PHP

      < ?php
      if ($_FILES["file"]["error"] > 0)
        {
        echo "Error: " . $_FILES["file"]["error"] . "
      "; } else { echo "Upload: " . $_FILES["file"]["name"] . "
      "; echo "Type: " . $_FILES["file"]["type"] . "
      "; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " kB
      "; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } ?>

      En el caso de multiples archivos, puedes usar algo parecido a esto:

      < ?php
      public function arrayFiles ( &$file_post )
      {
          if( empty( $file_post ) ) {
              return $file_post;
          }
          if( 'array'!==gettype($file_post['name']) ) {
              return $file_post;
          }
          $keys = array_keys($file_post['name']);
          $file_array = array();
          foreach ($keys as $key) {
             foreach ($file_post as $res=>$item) {
                 $file_array[$key][$res] = $item[$key];
             }
         }
         return $file_array;
      }
      ?>
      

      Espero haberte ayudado.

      Un saludo,

      Fran.

  • Buenas tardes, como podria adaptar la funcion , ya que recibo el nombre de la carpeta por metodo POST y tengo la carpeta dentro de otra que se llama “cursos”

    Ejemplo

    cursos/ejercicio

    Como eliminaria esa carpeta?

    Gracias

    • Muy buenas Cesar,
      No entiendo exactamente que es lo que quieres hacer.
      Si sólo borrar la caperta “ejercicio” o borrar todo.

      Si lo que quieres es que sólo elimine la carpeta que te pasan por el método POST, lo único que tienes que hacer es darle a la variable $carpeta el valor de la variable pasada por post:


      $carpeta = $_POST['carpeta'];

      Si no he entendido bien la pregunta, por favor, acláramelo e intentaré ayudarte.

      Un saludo,

      Fran.

  • Tu código, aunque es muy bueno, casi elimina todos los programas que tengo instalados, y hubiera borrado también los archivos principales del windows si no fuera por que no tiene los permisos necesarios… aunque admito que fue mi error y fue estúpido, no deja de ser importante.

    Cuando se ejecuta, se debe procurar pasar un parámetro a juro, sino comenzara a buscar las rutas con “/*”, que es así como comienza prácticamente cualquier carpeta del sistema, y de hecho, eso es lo que hace. Y ya saben lo que hace con los archivos dentro de las carpetas que busca (Los borra) .

    • Muy buenas Pablo,
      Me sabe mal que hayas tenido algún problema con el código, pero creo que el funcionamiento del mismo estaba bastante claro. La idea precisamente es que borre todos los archivos que encuentre a su paso de forma recursiva en la ruta que se le ha suministrado.

      Lo normal, creo yo, sería que hubieses probado el código en alguna carpeta realizada a propósito para la prueba.
      Pero bueno, para otra vez ya lo sabes 😉

      Si tienes cualquier pregunta, no dudes en comentarla. Intentaremos resolverla.

      Un saludo,

      Fran.

    • Otra cosa, por favor quiten el de su pagina web:
      style:

      #respond form label, .comment-form .required {
      display:none;/*no es posible ver el captcha*/
      }
      y al input id=”cptch_input” quiten el

      style:

      margin-bottom:0;
      display:inline;
      font-size: 12px;
      width: 40px;

      No permite la entrada de valor al input restante para completar el formulario.
      de acuerdo a su condición de validez.

      /*si quisiera ocultar los label del form hubiesen agarrado solo el label y ya pero porque el input del captcha no es posible enviar comentarios de esa forma*/

      PD: Espero que puedan responder mi duda (borrar ‘carpeta 2’)

      Saludos desde Arg Bs As
      Ramiro Portas.

        • Si el problema de su pagina aun sigue y en los navegadores que he probado son Chrome y Firefox. El problema es que dentro de el nodo hay un nodo /* parte del captcha*/
          dentro de el nodo hay un nodo
          y finalmente dentro del nodo hay 2 nodos:

          /*este esta con display: none*/

          y ese mismo tiene un que debe ser llenado (el capcha)
          de no ser llenado el formulario nunca se envía.

          el tiene el (style=”width: 40px;”) con quitar ese atributo es posible ver que escribís de lo contrario es imposible.

          Espero que lo revisen.
          Un saludo !

          • Muchas gracias Ramiro!
            Ya lo hemos solucionado.

            Por otro lado, espero que la solución que te hemos dado para borrar el directorio que quieres te resulte útil.

            Un saludo!!

    • Muy buenas Ramiro,
      Si lo que quieres es saber como usar el código del post para poder evitar que borre la carpeta que tú quieras, podríamos hacer algo así:

      <?php
      function eliminarDir($carpeta, $salvar_carpeta = NULL)
      {
          foreach(glob($carpeta . "/*") as $archivos_carpeta)
          {
              echo $archivos_carpeta;
       
              if (is_dir($archivos_carpeta))
              {
                  eliminarDir($archivos_carpeta);
              }
              else
              {
                  unlink($archivos_carpeta);
              }
          }
      
          if (($salvar_carpeta) && ($carpeta != $salvar_carpeta))
          {
              rmdir($carpeta);
          }
      }
      ?>

      Si con esto no te sirve, puedes hacerlo a piñon, sin modificar los argumentos y en el if donde comprobamos la variable que me acabo de inventar ($salvar_carpeta) puedes comprobar el nombre de la carpeta (aunque esto deja de ser dinámico).

      Espero haber contestado a tu pregunta, sino dímelo y la intentaré resolver de nuevo 😉

      • Hola nuevamente estoy intentando con el código que me pasaron pero no tengo éxito.

        la estructura del directorio es la siguiente:

        php/setting/eliminar.php
        carpeta1/carpeta2/index.php

        el código que me pasaron sale de ‘php/setting/eliminar.php’
        me elimina el archivo que creo dentro de ‘carpeta2’ pero no las carpetas:

        $carpeta = ‘../../carpeta1/carpeta2’;
        $salvar_carpeta = ‘../../carpeta1’;
        $archivos_carpeta = ‘../../carpeta1/carpeta2/index.php’;
        eliminarDir($carpeta);

        que debo modificar???

        • Hola de nuevo,
          creo que esta condición no me salvaría la carpeta 2
          if (($salvar_carpeta) && ($carpeta != $salvar_carpeta))
          {
          rmdir($carpeta);
          }
          porque la sentencia rmdir apunta al directorio ‘../../carpeta1/carpeta2’
          borraría todo el directorio sin poder salvar.
          comprendo todo el código esta perfecto borraría todo los archivos pero la condición final no se ajusta a mi petición
          creo que no me queda mas remedio que poner el archivo de donde sale el codigo dentro de carpeta1, lo cual me serviria para eliminar archivos y carpetas posteriores al directorio carpeta1.

          porque rmdir borra desde su directorio en adelante los directorios que le mencionas al menos eso es lo que entiendo.

  • Perdón, no sabia que bloqueaban los nodos HTML al comentar, aquí de nuevo !

    Si el problema de su pagina aun sigue y en los navegadores que he probado son Chrome y Firefox.
    El problema es que dentro de el nodo (form) hay un nodo(p class=”cptch_block”) /* parte del captcha*/

    Dentro de el nodo(p class=cptch_block) hay un nodo (span class=”cptch_wrap”)

    Dentro del nodo (span class=”cptch_wrap”) hay 2 nodos:

    (label class=”cptch_label” for=”cptch_input”)
    (span class=”cptch_reload_button_wrap hide-if-no-js”)

    /*este nodo(label class=”cptch_label” for=”cptch_input”) esta con display: none*/

    Y ese mismo tiene un nodo (span class=”cptch_span”) que contiene el nodo:

    (input id=”cptch_input” class=”cptch_input” type=”text” autocomplete=”off” name=”cptch_number” value=”” maxlength=”2″ size=”2″ aria-required=”true” required=”required” style=”margin-bottom:0;display:inline;font-size: 12px;width: 40px;”)

    el nodo (input) tiene el (style=”width: 40px;”) con quitar ese atributo es posible ver que escribís de lo contrario es imposible.

    Espero que lo revisen.
    Un saludo !

    • Ahora si!!!!

      es posible poder comentar sin editar su código muchas gracias por la pronta respuesta.

      en el día de mañana (lunes) estaré probando probando el codigo para la ‘carpeta2’

      Aquí en Bs. As. argentina es un lindo domingo para salir a pasear un saludo.

  • jajaja que dormido estoy aquí de nuevo

    Ahora si!!!!

    es posible poder comentar sin editar su código muchas gracias por la pronta respuesta.

    en el día de mañana (martes) estaré probando probando el codigo para la ‘carpeta2’

    Aquí en Bs. As. argentina es un lindo lunes para salir a pasear un saludo.

  • Hola, interesante función. Pero me ocurrió un problema grave…al igual que Pablo en los comentarios pasados… Le especifiqué la ruta de la carpeta que necesita eliminar…pero sucede que me borró una infinidad de carpetas y archivos del directorio web, y necesito recuperarlas, por favor una ayuda. Se los agradecería un montón. Saludos

    • Buenas Luis. No se si es tu caso, pero tanto en Windows como en Mac OS, se pueden recuerar archivos volviendo en el tiempo al punto antes de haber borrado esos archivos (si lo has configurado antes), supongo que no es el caso. Además si indagas en internet, puedes llegar a encontrar programas para recuerar archivos borrados. ¿En que sistema operativo trabajas?

      • hola! bueno generalmente trabajo con Windows Server, pero lamentablemente no tengo configurados los puntos de restauración.. finalmente apliqué Recuva, y logre restaurar el 80% del directorio.. eso es mejor que nada. Gracias por la preocupación. Saludos.

Deja un comentario