[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