
Una de las tareas habituales de una aplicación es obtener un listado del contenido de un directorio para llevar a cabo algún tipo de proceso de los ficheros que contiene.
En este artículo se explica cómo listar los ficheros de un directorio en un script PHP, y cómo recorrer recursivamente un árbol de directorios.
Listar los ficheros contenidos en un directorio
En PHP, se utilizan las funciones opendir(), readdir() y closedir() para obtener los nombres de los ficheros contenidos en un directorio.
opendir() devuelve un cursor, que es pasado como argumento a la función readdir(). Cada vez que es llamada, readdir() devuelve el nombre del siguiente fichero en secuencia. Por último, closedir() cierra el cursor abierto con opendir().
Ejemplo. El siguiente script “lista_directorio.php”:
1 2 3 4 5 6 7 8 |
$directorio = "."; $hDir = opendir($directorio) or die("Error. No se ha podido abrir el directorio"); while ($fich = readdir($hDir)) { echo "Fichero: " . $fich . "\n"; } |
genera como resultado, en el directorio en donde lo ejecutamos:
1 2 3 4 5 6 |
$ php lista_directorio.php |more Fichero: . Fichero: .. Fichero: lista_directorio.php |
Como vemos, en un sistema unix, readdir() devuelve también las entradas especiales “.” y “..”.
Recorrer un árbol de directorios
Para recorrer un árbol de directorios, debemos determinar cuáles de los ficheros contenidos en un directorio son a su vez directorios. Para ello utilizamos la función is_dir(). Para cada subdirectorio encontrado, llamamos recursivamente a la función que lista su contenido.
Ejemplo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function recorre_arbol($directorio){ $hDir= opendir($directorio) or die('Error. No se ha podido abrir el directorio'); while($fich = readdir($hDir)) { if(is_dir($directorio.'/'.$fich) && $fich != '.' && $fich != '..') { echo $directorio.'/'.$fich."\n"; recorre_arbol($directorio.'/'.$fich); } else if ($fich != '.' && $fich != '..') { echo $directorio.'/'.$fich."\n"; } } closedir($hDir); } |
Filtrar los resultados obtenidos
Para procesar únicamente los ficheros cuyo nombre se ajusta a un determinado patrón, basta con utilizar la función preg_match.
Por ejemplo, para listar únicamente los ficheros con extensión “.txt”:
1 2 3 4 5 |
if (preg_match("/.*\.txt$/", $fich)) { echo "Fichero: " . $fich . "\n"; } |
—
Indice de artículos sobre programación en lenguaje PHP
—