[Php-avanzado] manejo de directorios

Leonardo Tadei - Pegasus Tech Supply leonardot en pegasusnet.com.ar
Sab Abr 24 22:01:50 ART 2010


Hola Jésica,

	Muy bueno tu código comentado: es fácil de leer.
	Me costó leer la condición del if ($subdir!="."&&$subdir!
=".."&&is_dir($subdir) ... unos espacios o paréntesis encerrando las
opciones te facilitarán la posterior lectura de la condición

El sáb, 24-04-2010 a las 22:17 +0000, Jesica Billia escribió:
> 
> Hola, tengo una consulta, estyo armando un bucle donde inicialmente
> coloco un directorio y quiero q me guarde dentro de un 
> arreglo los subdirectorios que están dentro. El tema es que no me está
> funcionando porque no entra la función is_dir(), no sé si 
> le estoy colocando algún parámetro mal o qué puede ser... 

	Tenés varios detalles en tu código, principalmente de ámbito de
variables por ser tu función recursiva.
	Uno es que closedir($hdir) falla, porque el nombre de tu recurso es
$dir_ y no $hdir.
	Un detalle menor es que  if (is_dir($dir)==true) es equivalente a solo
if (is_dir($dir)), porque la salida de is_dir() es booleana.
	Otro es que llamás recursivamente directorio($subdir), pero no le
asignás a nadie la salida de la función directorio(), que es un vector,
lo que significa que por más que entre, el resultado no va a ningún
lado.
	Respecto a esto, además, $devolver[] es un vector local a la función,
lo que significa que tiene valor solo dentro de la función. Tu llamada
recursiva, como en cualquier lenguaje, ejecuta diferentes instancias en
memoria de directorio(), y cada una de esas instancias tiene su propio
"devolver[]" que se pierde al terminar la ejecución de la función. Me
explico? Tu función se ejecuta, pero el valor se pierde de dos maneras:
uno por no asignar la llamada a directorio() anidada, y otro por asumir
que devolver[] existe atravesando los ámbitos de las funciones.

	Una solución es reemplazar las líneas:

                    directorio($subdir);
                    $devolver[]=$dir.$subdir;

	Por:
                    $devolver[]=directorio($subdir);

	Así sí funciona, porque a cada corrida recursiva se le asigna el
resultado a $devolver[], y cuando termina la última instancia del
anidamiento, el último vector tiene todos los valores.
	Obtenés un vector multidimensional, con el mismo anidamiento que la
estructura de directorios.


PD: por qué no usaste scandir() en vez de opendir() ???

> copio un fragmento:
> 
> function directorio($dir){
>     if (is_dir($dir)==true){    
>         $devolver[]=$dir;//agrego el directorio
>         if ($dir_=@opendir($dir)){//si abre el directorio
>            while (false!==($subdir=readdir($dir_))){//mientras que
> tenga contenido    
>                 if ($subdir!="."&&$subdir!=".."&&is_dir($subdir)){//
> si es DIR
>                     directorio($subdir);
>                     $devolver[]=$dir.$subdir;
>                  }     
>             }// WHILE contenido
>         }// fin si abro el dir 
>         closedir($hdir);
>     }
>      return $devolver; 
> }//fin funcion
> 
> 
> 
> gracias!!!!!!

-- 

Leonardo Tadei
leonardot en pegasusnet.com.ar
http://blog.pegasusnet.com.ar
Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key



Más información sobre la lista de distribución Php-avanzado