Feeds:
Entradas
Comentarios

Posts Tagged ‘directorio’

Borrar un Directorio

I. Introducción 

Con este artículo no pretendo mostraros ninguna maravilla en programación. Consiste en una función sencilla, muy simple y de fácil implementación que es capaz de borrar un directorio y todos los subdirectorios que existan en ella.

A veces, en muchas de las páginas que se implementan, surge la necesidad de poder borrar un directorio de una determinada carpeta. El problema surge cuando, para borrar un directorio, es necesario antes eliminar todos los ficheros que contenga. Es decir, el directorio debe estar vacío. Ésto puede suponer un quebradero de cabeza si no pensamos las cosas con claridad.

Por ello, y debido a la necesidad que me surgió, implementé una sencilla función (no más de diez líneas) que borrara recursivamente todos los ficheros y subdirectorios dentro de una carpeta.

 

II. Implementación

El código de la función a implementar es el siguiente:

function borra_carpeta_llena($dir){
     if (is_dir($dir)) {
          if ($gd = opendir($dir)) {
               while (($archivo = readdir($gd)) !== false){
                    if($archivo!=».» && $archivo != «..»){
                         if(is_dir($dir.»/».$archivo)){borra_carpeta_llena($dir.»/».$archivo);rmdir($dir.»/».$archivo);}
                         else{unlink($dir.»/».$archivo);}
                    }
               }
               closedir($gd);
          }
     }
}
 

Pues bien, su explicación es bastante sencilla.

Para empezar, cabe destacar que el parámetro que se le mete a la función es la ruta de directorio que queremos borrar. Me explico, ese directorio es el que vaciaremos pero no se borrará. Si luego queremos borrar dicho directorio también, bastará con poner rmdir($dir) puesto que ese directorio ya se encontrará vacío.

if (is_dir($dir)) {
     if ($gd = opendir($dir)) {

Lo primero que hace la función es comprobar que dicho directorio existe y luego intenta abrirlo. Lógicamente, en caso de no poder abrirlo o no existir, saldría de la función sin ningún tipo de problemas. Ésto nos hará evitar posibles errores posteriores.

while (($archivo = readdir($gd)) !== false){
     if($archivo!=».» && $archivo != «..»){
          if(is_dir($dir.»/».$archivo)){borra_carpeta_llena($dir.»/».$archivo);rmdir($dir.»/».$archivo);}
          else{unlink($dir.»/».$archivo);}
     }
}

Lo que se hace a continuación es recorrer el directorio en cuestión fichero por fichero. Intento leer un fichero (($archivo = readdir($gd)) !== false) y si lo puedo abrir para leer, entonces prosigo.

En caso afirmativo, debo comprobar que el fichero abierto no sea el de cambio de directorio (es decir, un «.» o los dos «..»). En cuyo caso ya debo verificar si nos encontramos ante un fichero o ante un subdirectorio. Es aquí cuando tomaré las dos posibles decisiones:

if(is_dir($dir.»/».$archivo)){borra_carpeta_llena($dir.»/».$archivo);rmdir($dir.»/».$archivo);}

Si es un directorio, vuelvo a llamar a la función indicándole como ruta del directorio aquella donde se encuentre y a continuación, borro dicho directorio.

 

else{unlink($dir.»/».$archivo);}

Si se trata de un fichero, borro directamente dicho fichero.

 

Como veis, su explicación es bien sencilla pero, simplemente con la llamada a la función ya nos quitamos de ir borrando cada directorio uno por uno.

 

La llamada a la función sería como sigue:

$dir = «ruta/carpeta/a/borrar»;
borra_carpeta_llena($dir);
 

Sencillamente eso, sin ningún tipo de historias ni librerías ni nada por el estilo.

 

III. Referencias

Read Full Post »