Inicio > Programacion > Función recursiva en PHP para listar Directorios y Archivos

Función recursiva en PHP para listar Directorios y Archivos

Ahora les traigo una funcion que me ha servido de mucho, esta función solo recibe como parametro la ruta o carpeta que queremos listar su contenido. Por ahora solo la imprime en una lista un poco fea, :-( pero bueno ya depende de la creatividad de cada uno para darle mejor aspecto, por ejemplo se puede hacer un árbol que al dar clic en un directorio se desplegue su contenido, o hacer un explorador de archivos al estilo de joomla o como el que trae el mismo windows cuando le damos abrir ha algún fichero, bueno muchas mas cosas que se les pueda imaginar.

Aquí ta la función:

function listar_directorios_ruta($ruta)
 {
 // abrir un directorio y listarlo recursivo
 if (is_dir($ruta))
 {
 if ($dh = opendir($ruta))
 {
 echo "<br /><strong>$ruta</strong>"; // Aqui se imprime el nombre de la carpeta o directorio

 while (($file = readdir($dh)) !== false)
 {
 //if (is_dir($ruta . $file) && $file!="." && $file!="..") // Si se desea mostrar solo directorios
 if ($file!="." && $file!="..") // Si se desea mostrar directorios y archivos
 {
 //solo si el archivo es un directorio, distinto que "." y ".."
 echo "<br />$ruta$file"; // Aqui se imprime el nombre del Archivo con su ruta relativa
 listar_directorios_ruta($ruta . $file . DIRECTORY_SEPARATOR); // Ahora volvemos a llamar la función
 }
 }
 closedir($dh);
 }
 }
 }

Ahora va una pequeña explicación, Es un poco complicado entender lo de la recursividad, pero vamos a tratar de eplicar, porque como es posible que una función se mande a llamar a si misma. que raro no, bueno resulta que cuando una función se llama a si misma se crea una pila de ejecución la cual va guardando las llamadas que hace la funcion, cuando una termina, inmediatamente se empeza a ejecutar la siguiente, es decir es un proceso que consume un poco de recursos, debido a que necesita gran cantidad de memoria en tiempo de ejecucion para poder guardar la pila de ejecución.

Que hace realmente la función?. Lo primero es verificar si el parametro recibido es un directorio si es asi abrimos el directorio, con opendir, ahora leemos cada uno de los archivos dentro del directorio, si el archivo leido es un directorio, mandamos a llamar nuevamente a la función, y se repite el proceso. Al terminar es recomendable, bueno por no decir necesario, cerra el directorio.

Espero y quede claro la explicación alguna duda pregunten que pa eso tamos aqui… : )

Advertisement
Categorías:Programacion Etiquetas:
  1. black_panther
    marzo 26, 2011 a las 7:49 pm | #1

    Si, está muy bien este script, el problema es que no funciona, a mi al menos no me funciona, no encuentro ninguna forma de listar solo los subdirectorios de un directorio, no quiero ver los archivos, tan solo las carpetas, pues no hay forma, yo al menos no soy capaz de hacerlo, he probado todos los scripts que he podido encontrar, si, me listan archivos y directorios, todo mezclado, etc…pero no.

    • marzo 27, 2011 a las 6:08 pm | #2

      que tal black_panther, revise el codigo y todo anda bien, lo probe en Ubuntu y todo funciono a la perfeccion, seria bueno que comentaras en que sistema operativo lo estas probando, te comento que la funcion realiza una lectura profunda del directorio, es decir, si le pasa como parametro ‘./’ te lee todas las carpetas y las subcarpetas de cada una, por ejemplo se mete al directorio var, al entar dentro de var, lee lib, se mete en al directorio y asi susecivamente hasta leer todos los subdirectorios. por ejemplo yo lo ejecute de la siguiente forma:
      listar_directorios_ruta(‘/home/pascual/Documentos/ECM/’);

      Ahora si tu quieres que solo lea los directorios comenta esta linea
      //if ($file!=”.” && $file!=”..”) // Si se desea mostrar directorios y archivos

      y descomentar esta:
      //if (is_dir($ruta . $file) && $file!=”.” && $file!=”..”) // Si se desea mostrar solo directorios

      Si quieres que no sea una función recursiva, que solo lea el directorio actual y no se meta dentro de los directorios, comenta esta linea:
      //listar_directorios_ruta($ruta . $file . DIRECTORY_SEPARATOR); // Ahora volvemos a llamar la función

      Algunas recomendaciones:
      A. Revisar que el directorio tenga los permisos adecuados para lectura.
      B. Colocar al final del la ruta del directorio la diagonal inversa ( / ).

  2. ddarthp
    agosto 27, 2011 a las 5:26 pm | #3

    me sale todo en blanco que hacer especifico $ruta=”./”;

  1. enero 3, 2011 a las 1:18 am | #1

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s

Seguir

Get every new post delivered to your Inbox.