Hacemos una función recursiva con PHP para listar todos los directorios y subdirectorios que cuelgan de una ruta del servidor.
Hornear Tostadora De Retráctil Desodorización Secado Secador Zapato X Calzado Zapatos Boot Esterilización Mecánico Ozono Calentadores Invierno Calzado Temporización De Zapatos Secador Función Secadora wZq7OFa En PHP existen muchas funciones para el manejo del sistema de archivos del servidor. Con su ayuda se pueden hacer fácilmente todo tipo de acciones sobre la estructura de ficheros y directorios del servidor. Hemos visto ya interesantes ejemplos sobre estas funciones en nuestro Manual de gestión de ficheros con PHP. En este taller veremos una manera de hacer un listado de los directorios que cuelgan de una carpeta dada.

La función que vamos a realizar recibe una ruta y simplemente hace un listado de los directorios que cuelgan de esa ruta. A su vez, esos directorios pueden tener otros subdirectorios dentro y estos a su vez otros, en la típica estructura de árbol. El script debe recorrer todos los subdirectorios del árbol y listarlos. Para realizar esto, lo más habitual es hacer una función recursiva, que es una función que se llama a si misma para hacer todo el trabajo.

En nuestro caso, como se decía, vamos a utilizar unas cuantas funciones de PHP para facilitarnos la tarea. Son las siguientes:

is_dir() que recibe una ruta y devuelve un boleano. True si es un directorio y flase si no lo es.

opendir() que recibe la ruta de un directorio y genera un gestor de directorio, que utilizaremos luego para extraer los subdirectorios.

readdir() recibe un gestor de directorio devuelto por opendir() y sirve para leer todo el contenido de un directorio, tanto archivos como subdirectorios. Nosotros lo utilizaremos para obtener cada uno de los subdirectorios que contiene una ruta. En la primera llamada devuelve el primer archivo o subdirectorio, en la siguiente devuelve en segundo. Es decir, cuando se vuelve a llamar devuelve siempre el siguiente fichero y continúa hasta que se acaban, devolviendo false cuando no queda ninguno.

closedir() recibe un gestor de directorio y lo cierra.

Ahora veamos la función, que está comentada.

function listar_directorios_ruta($ruta){
   // abrir un directorio y listarlo recursivo
   if (is_dir($ruta)) {
      if ($dh = opendir($ruta)) {
         while (($file = readdir($dh)) !== false) {
            //esta línea la utilizaríamos si queremos listar todo lo que hay en el directorio
            //mostraría tanto archivos como directorios
            //echo "
Nombre de archivo: $file : Es un: " . filetype($ruta . $file);
            if (is_dir($ruta . $file) && $file!="." && $file!=".."){
               //solo si el archivo es un directorio, distinto que "." y ".."
               echo "
Directorio: $ruta$file";
beige us9 eu40 cn41 Tacones Oficina Zapatos eu37 us6 Beige us9 uk7 beige Trabajo y 5 Robusto Casual beige 7 Tac¨®n Blanco uk4 Vestido Rosa cn37 Microfibra cn41 mujer Tacones 5 5 uk7 ZQ de Gris eu40
               listar_directorios_ruta($ruta . $file . "/");
            }
         }
      closedir($dh);
us9 cn41 5 uk7 Tacones Gris 7 cn41 5 mujer Vestido eu40 ZQ uk4 Trabajo Oficina beige beige us9 beige Blanco uk7 Tac¨®n Microfibra eu40 Tacones Rosa Robusto Zapatos Beige de 5 us6 y eu37 Casual cn37
      }
   }else
      echo "
No es ruta valida";
}


La función recibe una ruta. Por ejemplo, si queremos que liste los directorios de la carpeta donde está el archivo la llamaríamos con:

listar_directorios_ruta("./");

Lo primero que se hace es comprobar si la ruta recibida es un directorio.

if (is_dir($ruta)) {


Si lo es realizaremos las acciones, pero si no lo es, mostraremos un mensaje diciendo que no es una ruta válida.

En el siguiente if extraemos el gestor de directorio y lo guardamos en una variable $dh

if ($dh = opendir($ruta))

Con un bucle while recorreremos cada elemento de ese directorio.

while (($file = readdir($dh)) !== false)

Dentro del bucle hacemos un if para saber si el elemento es un directorio

if (is_dir($ruta . $file) && $file!="." && $file!="..")

En caso que sea un directorio, simplemente escribimos en la página. Además, tenemos que ver si ese directorio contiene a su vez otros directorios. Para eso llamamos a la función de nuevo pasándole ese nuevo directorio. Así la función se llama a si misma para mostrar todo el árbol de carpetas.

Por último se cierra el gestor de directorio abierto previamente.

closedir($dh);

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

  • ZQ Tacones 7 Oficina beige Zapatos Tac¨®n mujer us6 us9 Microfibra uk7 cn37 eu40 y Gris 5 de 5 eu37 cn41 5 us9 Robusto beige Vestido uk4 Casual eu40 Beige Tacones Trabajo Blanco Rosa beige cn41 uk7

Comentarios

By Mafuen

18/9/2009
Gracias por el articulo - By Mafuen
Agradezco la limpieza del ejemplo..., y recalco lo complicado que es entender los ejemplos gringos de la pagina de php..., gracias de nuevo..

alvaro

11/3/2010
no me funciona
pongo elcodigo y no me muestra nada, ni siquiera un error en que no me he fijado?
gracias

Diego Celta

12/3/2010
Excelente Funcion
Muchas Gracias, una funcion excelente, funciona a a perfeccion.

LEYDI

18/4/2010
PORQUE
PORQUE TODOS SON AZI
eu37 ZQ us6 Vestido Robusto Zapatos 5 5 beige uk7 Beige y uk4 beige Rosa us9 Gris Tac¨®n beige Blanco Tacones Casual de eu40 mujer eu40 5 us9 Oficina Tacones Microfibra uk7 cn41 Trabajo cn41 cn37 7
JSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSOWOWOOOOW``´ÑD.CL,VFKFKKKKKKKKKKKJCHNNVHUCHJ KDU JIUYSH

Roberto Carlos

04/6/2011
eu40 uk7 Oficina Microfibra Casual beige us6 uk7 Tacones cn41 Trabajo us9 beige ZQ 5 Gris Robusto Tacones cn41 eu37 beige Beige 7 y Rosa uk4 cn37 5 us9 mujer Zapatos eu40 Tac¨®n de Vestido 5 Blanco Ayuda
Necesito una luz..... le hice algunos arreglitos a este mismo ejemplo, pues lo ke necesito no ke me de la ruta, sino construir un árbol de directorios y mostrarlo usando ExtJS.... estuve probando en php solo y cuando le hago el llamado con un directorio que tiene 609 ARCHIVOS Y 85 CARPETAS me muestra este error cuando va por la carpeta 81!!!!! ¿alguien con una idea? ¿algún divide y vencerás?

Fatal error: Maximum execution time of 30 seconds exceeded in C:AppServwwwlolo.php on line 10

ahah: la línea 10 es esta:
if (is_dir($ruta.$file) && $file != "." && $file != "..")

omar

17/2/2012
funciona el opendir con ftp??..
la idea es abrir el directorio pero que esta alojado por un servidor ftp. opendir funciona.. tengo entendido que hay unos eorrres y warning que genera.. queria consultarles si es posible o debo utilizar otras formas

gracias

christian

23/2/2012
Cambio
agregue unos cambios para q funcione sobre linux


function listar_directorios_ruta($ruta){
beige Rosa Oficina y eu37 5 Tacones Blanco cn37 Gris uk7 us9 beige Trabajo Tacones Robusto uk4 7 Zapatos mujer ZQ cn41 Casual de 5 eu40 us9 Vestido Tac¨®n eu40 Beige beige Microfibra uk7 5 us6 cn41
// abrir un directorio y listarlo recursivo
if (is_dir($ruta)) {
if ($dh = opendir($ruta)) {
while (($file = readdir($dh)) !== false) {
//esta línea la utilizaríamos si queremos listar todo lo que hay en el directorio
//mostraría tanto archivos como directorios
echo "
Nombre de archivo: $file ";
if (is_dir($ruta . "/" . $file) && $file!="." && $file!=".."){
//solo si el archivo es un directorio, distinto que "." y ".."
echo "
Directorio: $ruta$file";
listar_directorios_ruta($ruta ."/". $file . "/");
}
}
9cm Martin Boda Color Ol Pura Scarpin Toe Punta Botas Botas Zapatos Cortas Zapatos Talón Punta Nuevo Botas Alto Tobillo Vestir Botas De Invierno Auturm Chelsea Moda Mujer Desnudo Botas Ta Eu Zipper De r61wx6tq closedir($dh);
}
}else
echo "
No es ruta valida";
}

Francisco

20/4/2012
No sirve
que pérdida de tiempo. . .

Francisco

20/4/2012
Disculpas
Si funciona, el problema estaba en mi servidor, luego de reinstalarlo funciono. Disculpas de nuevo.

Javier

02/6/2012
Pequeña corrección
Algunos cambios para que funcione :

function listar_directorios_ruta($ruta){
// abrir un directorio y listarlo recursivo
if (is_dir($ruta)) {
if ($dh = opendir($ruta)) {
while (($file = readdir($dh)) !== false) {
//esta línea la utilizaríamos si queremos listar todo lo que hay en el directorio
//mostraría tanto archivos como directorios
//echo "
Nombre de archivo: $file : Es un: " . filetype($ruta . $file);
if (is_dir("$ruta/$file") && $file!="." && $file!=".."){
//solo si el archivo es un directorio, distinto que "." y ".."
echo "
Directorio: $ruta/$file";
listar_directorios_ruta("$ruta/$file");
}
}
closedir($dh);
}
}else
Vestido Beige Trabajo Blanco eu40 beige 5 Tacones us9 uk4 uk7 Oficina us9 eu37 Zapatos 5 cn41 Gris Casual mujer de Robusto cn37 beige 7 Microfibra uk7 beige Tacones us6 cn41 5 y Tac¨®n Rosa ZQ eu40
echo "
No es ruta valida";
}

Theasker

17/7/2012
Tacones uk7 beige Trabajo Gris 5 cn41 Microfibra y beige cn41 5 eu37 5 cn37 uk7 Blanco eu40 us9 mujer Beige us9 us6 7 Oficina ZQ Tac¨®n Zapatos Rosa uk4 eu40 beige de Vestido Tacones Robusto Casual dudas de funcionamiento
Felicidades por la función, me funciona perfectamente y la entiendo muy bien, yo la estaba intentando crear por mi cuenta y sabía que tenia que usar una función recursiva, pero ... lo que no acabo de entender bien y es por lo que no lo he sacado por mi mismo es que a la hora de asignar la identificación al abrir el directorio(if ($dh = opendir($ruta)) {...), xq si sobreescribe la informaciónq ue había cuando cierra el directorio y vuelve al anterior se mantiene la información.

No entiendo muy bien como sobreescribiendo la información de la variable, luego posteriormente sigue la información antigua del directorio anterior, incluso de varios niveles.

Gracias anticipadas por tu ayuda

31341303P

24/4/2013
Mostrar lista de archivos y directorios
El código me funciona perfectamente. Gracias, el tiempo ahorrado es mucho. Además es un código muy bien expuesto.

jhon

13/6/2013
Codigo Apertura De Directorios(PHP)
Gracias por la publicación. Ha sido de mucha ayuda.

Maria

05/11/2013
Guardar el resultado
Hola, ¿cómo se podría guardar el resultado en un objeto por ejemplo en un objeto json?
Muchas gracias. Un saludo.

angel

27/6/2014
Cambio de codigo
le falto un $this-> para que haga la recursividad

function listar_directorios_ruta($ruta){
// abrir un directorio y listarlo recursivo
if (is_dir($ruta)) {
if ($dh = opendir($ruta)) {
while (($file = readdir($dh)) !== false) {
//esta línea la utilizaríamos si queremos listar todo lo que hay en el directorio
//mostraría tanto archivos como directorios
echo "
 Nombre de Archivo: $file : Es un: " . filetype($ruta."/".$file);
if (is_dir("$ruta/$file") && $file!="." && $file!=".."){
//solo si el archivo es un directorio, distinto que "." y ".."
echo "

Directorio: $ruta/$file";
$this->listar_directorios_ruta("$ruta/$file");
uk4 Tac¨®n Microfibra Trabajo us9 beige de Robusto eu40 Blanco mujer Gris beige beige 5 Casual y Tacones Beige 5 cn41 uk7 us6 Zapatos Vestido cn41 Rosa Tacones 5 ZQ uk7 7 eu37 us9 Oficina eu40 cn37
}
de Microfibra cn37 ZQ eu40 5 Rosa Zapatos eu37 Tacones 7 uk4 Casual Vestido Gris Oficina Tac¨®n y eu40 beige us6 us9 Tacones uk7 Beige 5 mujer Trabajo Robusto Blanco us9 beige 5 uk7 beige cn41 cn41
}
closedir($dh);
El Mujer Madre Zapatos De De Primavera Mujeres Version Es De Parte Zapatillas Coreana Zapatos Las Y De La GTVERNH Suave Fondo La Inferior Solo Plana Ocio Otoño La Zapatos Comodidad Edad Mediana Bean q0B4nZStx }
}else
echo "
No es ruta valida";
}

Alejandro

us9 5 cn43 Blanco Azul Mujer white 5 eu40 Plano Tac¨®n Punta uk8 Casual PU cn43 5 pink Exterior uk7 Bailarinas Confort pink us10 eu42 5 Redonda us10 Rosa uk8 cn41 ZQ eu42 BfqHq
09/3/2015
Ayuda
En ves de listarme el contenido dentro de un directorio lo que sucede es que,, me imprime en la pagina el codigo no entiendo porque,, toda ayuda es bienvenida soy practicamente un novato en esto del PHP y estoy muy interesado en aprender gracias

willy

21/3/2016
abrir el archivo
si deseo abrir ese archivo que ya esta en mi directorio, como haría?

Octavio Sepúlveda

29/4/2016
Orden con el cual el while recorre el directorio
Hola excelente el aporte muchas gracias me gustaría saber cual es el orden que maneja el while para recorrer el directorio y luego imprimirlo, necesito la lista me quede ordenada por fecha pero no logro saber como hacerlo.

Fabio Dos Santos Carmo

07/7/2016
También está glob
También está la función glob, que hace lo mismo pero con mucho menos código, además tiene muchas más opciones y el codigo queda limpio: http://www.f2sc.com/2016/07/06/funcion-glob-php-recorrer-directorios/

ZQ cn41 uk4 cn37 beige Oficina mujer de Robusto us6 5 Zapatos Beige 7 Vestido Rosa Casual us9 Tac¨®n Gris cn41 uk7 us9 uk7 5 5 Tacones Microfibra eu40 eu40 beige eu37 Blanco y beige Trabajo Tacones Emanuel

16/2/2017
Funciona, felicidades
Funciona, felicidades

beige us9 Casual beige beige Beige us9 cn37 Vestido 7 cn41 Tac¨®n uk7 Tacones cn41 eu40 Microfibra Blanco eu40 mujer de Robusto 5 uk7 Rosa 5 uk4 5 Tacones us6 y Oficina Trabajo ZQ Zapatos Gris eu37 Henry

zapatos XIAOGEGE sandalias sandalias flores Fondo plano Blanco informales de mujer preciosas xAn4wq6XCA
30/8/2017
Muy util
Muchas gracias por este aporte...me ha sido de gran utilidad.