PHP Programación

Obtener listado de archivos de un directorio con 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.

EduZRO

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

No Comments

comment No comments yet

You can be first to leave a comment

Deja un comentario

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