Obtener listado de archivos de un directorio con PHP

PHP

En muchas ocasiones podemos querer listar los archivos de un directorio de nuestro servidor con PHP, bien sea para mostrar el resultado por pantalla o para procesarlo de algún modo. El proceso se base en preguntar a nuestro sistema operativo por los archivos o directorios deseados y mostrarlos por pantalla, algo para lo que PHP nos provee de ciertas funciones específicas.

Vamos a ver una función que extrae los nombres de los archivos y otras propiedades de los archivos de un directorio.

Función para listar archivos de un directorio

function obtenerListadoDeArchivos($directorio){

  // Array en el que obtendremos los resultados
  $res = array();

  // Agregamos la barra invertida al final en caso de que no exista
  if(substr($directorio, -1) != "/") $directorio .= "/";

  // Creamos un puntero al directorio y obtenemos el listado de archivos
  $dir = @dir($directorio) or die("getFileList: Error abriendo el directorio $directorio para leerlo");
  while(($archivo = $dir->read()) !== false) {
      // Obviamos los archivos ocultos
      if($archivo[0] == ".") continue;
      if(is_dir($directorio . $archivo)) {
          $res[] = array(
            "Nombre" => $directorio . $archivo . "/",
            "Tamaño" => 0,
            "Modificado" => filemtime($directorio . $archivo)
          );
      } else if (is_readable($directorio . $archivo)) {
          $res[] = array(
            "Nombre" => $directorio . $archivo,
            "Tamaño" => filesize($directorio . $archivo),
            "Modificado" => filemtime($directorio . $archivo)
          );
      }
  }
  $dir->close();
  return $res;
}

La variable $_SERVER[‘DOCUMENT_ROOT’] se corresponde al directorio raíz de tu página web, que suele ser el directorio ./var/www/public_html, aunque en caso de haber varias cuentas de usuario o varios hosts virtuales también puede ser otro directorio que depende de la configuración de nuestro servidor o del panel de hosting que utilicemos.

El valor devuelto por la función contendrá un array con todos los archivos, y cada archivo está reprensentado mediante un array asociativo que contiene el nombre, el tamaño y la última fecha de modificación de cada archivo o directorio.

Vamos a mostrar el array por pantalla usando al función recursiva print_r:

print_r($listadoArchivos);

Esta función imprimirá por pantalla algo como el siguiente ejemplo:

Array (
  [0] => Array
      (
          [Nombre] => mi_directorio/fondo.jpg
          [Tamaño] => 86920
          [Modificado] => 1077461701
      )
  [1] => ...
      (
          [Nombre] => mi_directorio/recursos.pdf
          [Tamaño] => 86920
          [Modificado] => 1077461701
      )
  [2] => ...
)

También podemos mostrar el resultado de un modo más bonito utilizando HTML y CSS, pero no es el objetivo de esta guía, así que os lo dejo a vosotros. Ahora vamos a ver otra función para listar los archivos de un directorio y de los directorios que existan dentro del mismo de un modo rescursivo.

Función para listar archivos de un directorio recursivamente

Usaremos la misma función pero le pasaremos un parámetro adicional para definir si recorreremos recursivamente o no el directorio que le pasemos como primer parámetro. También se comprobará que los directorios puedan leerse antes de listar sus archivos, para lo que se invocará de nuevo la misma función.

function obtenerListadoDeArchivos($directorio, $recursivo=false){

  // Array en el que obtendremos los resultados
  $res = array();

  // Agregamos la barra invertida al final en caso de que no exista
  if(substr($directorio, -1) != "/") $directorio .= "/";

  // Creamos un puntero al directorio y obtenemos el listado de archivos
  $dir = @dir($directorio) or die("getFileList: Error abriendo el directorio $directorio para leerlo");
  while(($archivo = $dir->read()) !== false) {
    // Obviamos los archivos ocultos
    if($archivo[0] == ".") continue;
    if(is_dir($directorio . $archivo)) {
      $res[] = array(
        "Nombre" => $directorio . $archivo . "/",
        "Tamaño" => 0,
        "Modificado" => filemtime($directorio . $archivo)
      );
      if($recursivo && is_readable($directorio . $archivo . "/")) {
        $directorioInterior= $directorio . $archivo . "/";
        $res = array_merge($res, obtenerListadoDeArchivos($directorioInterior, true));
      }
    } else if (is_readable($directorio . $archivo)) {
        $res[] = array(
          "Nombre" => $directorio . $archivo,
          "Tamaño" => filesize($directorio . $archivo),
          "Modificado" => filemtime($directorio . $archivo)
        );
    }
  }
  $dir->close();
  return $res;
}

La única diferencia ahora, tendremos arrays adicionales para cada directorio, siempre y cuando haya podido leerse su contenido.


Avatar de Edu Lazaro

Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

Si quieres conocer mis proyectos, sígueme en Twitter.

4 comentarios en “Obtener listado de archivos de un directorio con PHP

  1. buenas tardes ingeniero, me podias guiar que plugin puedo usar para mostrar los archivos de un directorio y poder manejarlos, o sea descargar, borrar, etc, esto en una pagina Wp, utilizo la plantilla twenty seventeen… Soy nuevo en este tema de WP y agradeceré tu ayuda…

  2. Demasiado codigo, mejor usar la funcion glob que recupera la informacion de un directorio pasado por parametro y la regresa en forma de un arreglo

  3. $cmd=»ls *.*»; //orden de listado de archivos
    $cadena=shell_exec($cmd); //ejecutar el comando, salida en variable
    $arreglo=explode(» «,$cadena); //resultado en un arreglo
    for( $i=1; $i<count($arreglo); $i++) //listando arreglo
    { echo $i."- ".$arreglo[$i]."»; }

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

“- Hey, Doc. No tenemos suficiente carretera para ir a 140/h km. - ¿Carretera? A donde vamos, no necesitaremos carreteras.”