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… : )

5 pensamientos en “Función recursiva en PHP para listar Directorios y Archivos

  1. Pingback: Los números de 2010 « El Blog de P4scu41

  2. 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.

    • 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 ( / ).

  3. Sirve también para borrar recursivamente un directorio y todos sus archivos. Para los archivos, se utilizaría unlink y para los directorios, rmdir, situados en posiciones estratégicas. No pego el código para evitar accidentes al copiar y pegar; ese tipo de acciones deben de ser realizadas con sumo cuidado.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s