Foros del Web » Programando para Internet » PHP »

Eliminar carpetas recursivamente con PHP, con opciones

Estas en el tema de Eliminar carpetas recursivamente con PHP, con opciones en el foro de PHP en Foros del Web. Saludos, se que en la web hay mucho info con respecto al borrado recursivo de carpetas en php, ya sea que estos tengan contenido y ...
  #1 (permalink)  
Antiguo 07/05/2011, 23:00
Avatar de djmashe  
Fecha de Ingreso: julio-2007
Ubicación: Posadas, Misiones
Mensajes: 52
Antigüedad: 17 años, 4 meses
Puntos: 2
Pregunta Eliminar carpetas recursivamente con PHP, con opciones

Saludos, se que en la web hay mucho info con respecto al borrado recursivo de carpetas en php, ya sea que estos tengan contenido y otras subcarpetas dentro, pero mi problema es el siguiente:
Necesito poder realizar el borrado a partir de un directorio dado y poder determinar si elimino tambien la carpeta que envio de referencia o si deseo eliminar solo el contenido que posea dentro suyo (archivos y/o subcarpetas), lo ejemplificare con la siguiente grafica:

Código HTML:
carpeta_01
|____ archivo_01
|____ archivo_02
|____ archivo_03
|____ carpeta_02
	  |____ archivo_04
	  |____ archivo_05	  
	  |____ carpeta_03	  
	  |____ carpeta_04	  
			|____ archivo_06
Teniendo en cuenta el ejemplo anterior, la idea seria enviar como parametros en una funcion:
  1. la ruta a partir del cual hacer el borrado de archivos y/o subcarpetas.
  2. un valor que indique si eliminar la carpeta que se envia como ruta principal.
A continuacion dejo un script que estoy intentando adaptar a esto que les comente, pero hasta el momento no puedo lograr que en caso de no querer eliminar la carpeta raiz de mi parametro, esto suceda ya que siempre me la elimina.

Código PHP:
Ver original
  1. <?php
  2. function deldir($directorio, $dirPrincipal, $delDirPasado)
  3. {  
  4.  $dirPrincipal = rtrim($dirPrincipal, '/') .'/';   
  5.  $directorio   = rtrim($directorio,   '/') .'/';
  6.  
  7.  $carpetaActual = opendir($directorio);
  8.  while(($enlace = readdir($carpetaActual)) !== false)
  9.  {
  10.   $porBorrar = $directorio . $enlace;
  11.   if(is_dir($porBorrar) && ($enlace != "." && $enlace != "..")) { deldir($porBorrar, $dirPrincipal, $delDirPasado); }
  12.   elseif($enlace != "." && $enlace != "..") { unlink($porBorrar); }
  13.  }
  14.  closedir($carpetaActual);
  15.  
  16.  if (strcasecmp($dirPrincipal, $directorio) == 0)
  17.  {
  18.   # 0: NO eliminar raiz | 1: SI eliminar raiz
  19.  if($delDirPasado == 1) { $directorio = $dirPrincipal; }
  20.  }
  21.  
  22.  rmdir($directorio);
  23. }
  24.  
  25. # llamada a la funcion: deldir(url_carpeta, url_carpeta, eliminarRaiz);
  26. # tanto el parametro 1 y 2 son iguales, el parametro 3 indica con 0: NO eliminar raiz | 1: SI eliminar raiz  
  27. deldir("carpeta_01", "carpeta_01", 0);
  28. ?>

Teniendo en cuenta esto, la idea es que si envio como carpeta a borrar "carpeta_01" y como parametro 3 el valor "0", no elimine la "carpeta_01", pero si envio como parametro 3 el valor "1" si lo haga.

Si prueban el ejemplo notaran que enviando 0 ó 1 en el parametro 3 de todas maneras borra la carpeta raiz pasada.

¿Alguien me podría ayudar para ver donde esta el error? Desde ya muchas gracias.

Última edición por djmashe; 09/05/2011 a las 05:29
  #2 (permalink)  
Antiguo 09/05/2011, 09:30
Avatar de djmashe  
Fecha de Ingreso: julio-2007
Ubicación: Posadas, Misiones
Mensajes: 52
Antigüedad: 17 años, 4 meses
Puntos: 2
De acuerdo Respuesta: Eliminar carpetas recursivamente con PHP, con opciones

Bueno, me auto respondo luego de estar peleando un poco mas con el script .
A continuación dejo el código necesario para eliminar un directorio dado, especificando si borrar todo el directorio o solamente el contenido que posee dentro:

Código PHP:
Ver original
  1. <?php
  2. function deldir($directorio, $borrarRaiz = false)
  3. {  
  4.  $directorio = rtrim($directorio, '/') .'/';
  5.  
  6.  $carpetaActual = opendir($directorio);
  7.  while(($contenidoCarpeta = readdir($carpetaActual)) !== false)
  8.  {
  9.   $rutaCompleta = $directorio . $contenidoCarpeta;
  10.   if($contenidoCarpeta != '.' && $contenidoCarpeta != '..')
  11.   {              
  12.    if(is_dir($rutaCompleta)) { deldir($rutaCompleta); }
  13.    else                      { unlink($rutaCompleta); }
  14.   }
  15.  }
  16.  closedir($carpetaActual);
  17.  
  18.  if($borrarRaiz == false)
  19.  {
  20.   if(!rmdir($directorio)) { return false; }
  21.  }
  22.  return true;
  23. }
  24. ?>

y la llamada a la función seria:


Código PHP:
Ver original
  1. <? 
  2.    $carpeta   = "../temp/";
  3.    $borrarRaiz = true; #true: deja la carpeta pero elimina el contenido. false: borra todo
  4.   echo ($borrarRaiz == false) ? "<h1>Borrado completo, incluyendo la raiz: $carpeta</h1>" : "<h1>Borrando solo el contenido de: $carpeta</h1>";
  5.    $rta = deldir($carpeta, $borrarRaiz);    
  6.    echo ($rta) ? "<p style='color:green'>Borrado con exito</p>" : "<p style='color:red'>Error en el borrado</p>";  
  7.   ?>


Desde ya, acepto sugerencias a los que quieran optimizar el mismo.

Etiquetas: carpetas, opciones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:27.