[PHP] Listar contenido de un directorio

Cuando empecé con php con lo que más disfrutaba era crear mini motores web, piezas de código en un único archivo que generan una web y los puedes poner donde quieras y te salvan de un apuro o te sirven de base para montar otras cosas (ampliando el codigo).

Hoy me he encontrado uno que hice para mostrar el contenido de una carpeta (sin activar el listar contenidos del servidor web).

Objetivo del script

Debe mostrar el contenido de un directorio (no entrará en los subdirectorios) y sólo mostrará los archivos.

Requisito

Debe ser comprensible y fácil de modificar (tanto el php como el html resultante), ya que así con unos pocos campos se puede adaptar para cualquier cosa que se pueda hacer leyendo el contenido de un directorio (listado de ficheros, galería de fotos, leer el directorio para montar una estructura para pasarlo a una galería jQuery,…).

El script

El esquema del script será:

Abrimos el directorio
mientras podamos leer del directorio{
 mostramos el contenido
}
cerramos el directorio

En php sería:

$dir_handle = @opendir($path) or die("No se pudo abrir $path");
while ($file = readdir($dir_handle)) {
 echo "<a href=\"$file\" title=\"$file\">$file</a><br>";
}
closedir($dir_handle);

vale ya lo tenemos, pero… muestra enlaces para todos los archivos en la carpeta, incluso ‘.’, ‘..’ y el propio archivo. como podemos arreglar esto?

Podemos hacer varias cosas,

hacer el if mas grande del mundo libre

 if($file == "." || $file == ".." || $file == "index.php" ) continue;

E ir añadiendo en la clausula todos los archivos que no queremos. Funciona, si pero lo hace complicado de mantener.

Usar Arrays y las extensiones de los archivos

Personalmente, es la solución que más me gusta (y con la que más cómodo estoy).

Suelo crearme un array con las extensiones que no quiero mostrar y luego comprobar si la extensión del archivo está en el array.

//array de extensiones (la cadena vacia es para el caso de '.' , '..' y los ficheros sin extension)
$no_mostrar=Array("","php");
//sacamos la posicion del último punto
$pos=strrpos($file,".");
//cortamos la cadena desde esa posición hasta el final
$extension=substr($file,$pos);
if (!in_array($extension, $no_mostrar)) {
//cosas que hacer si no está en el array
}
else{
//cosas que hacer si está en el array
}


Y ya lo tenemos, juntandolo todo queda (y añadiendo <ul> y <li> porque es un listado:


<h1>Listado de archivo</h1>

<ul>
<?php
//ruta a la carpeta, '.' es carpeta actual
$path=".";
$no_mostrar=Array("","php");
$dir_handle = @opendir($path) or die("No se pudo abrir $path");
while ($file = readdir($dir_handle)) {
 $pos=strrpos($file,".");
 $extension=substr($file,$pos);
 if (!in_array($extension, $no_mostrar)) {
 echo "<li><a href=\"$file\" id=\"enlace_$file\" title=\"$file\">$file</a></li>";
 }

}
closedir($dir_handle);
?>
</ul>

podemos añadir una variable contador dentro del while si queremos saber cuantos archivos estamos mostrando.

Como he dicho es muy extensible y modificable. Si quieres hacer una galeria de imágenes puedes cambiar


echo "<li><a href=\"$file\" id=\"enlace_$file\" title=\"$file\">$file</a></li>";

por


echo "<img src=\"$file\" id=\"enlace_$file\" title=\"$file\" alt=\"$file\" />";

y puedes quitarle el <ul> y el <h1> que he puesto y usarlo de con un include en cualquier otro script php… Mil posibilidades!!!


Comments

  1. De lujo tio. Un placer haber compartido contigo años de programación jaja

  2. xDDD un placer para mi tambien :D

  3. Se puede invertir para que solo muestre los que uno quiera, o sea en vez de poner los archivos que no aparescan al revez elejir solo los que quiero que se vean ejemplo:

    extenciones “jpg”, “png” y “gif” que todo lo demas quede afuera

    muy bueno tu script

  4. Claro :D,

    en el if:

    if (!in_array($extension, $no_mostrar)) {

    quitale el negado y solo se mostraran los que estén en el array $no_mostrar

    if (in_array($extension, $no_mostrar)) {

  5. para mi creo que este script seria genial, mi unico problema ”creo” es que el directorio lo recivo atraves de una var y no se demasiado bien como tengo que hacer para definirla dentro del “.” mi var es $result->slug
    Sabrias como podria meter esa var dentro de los ” “

  6. pues en vez de $path=”.”; pones $path=tu variable con la ruta. ten en cuenta que la ruta debe de ser absoluta o relativa a la carpeta del script.

    Un saludo

  7. Gracias Xhiena, al final lo eh podido conseguir, otro problema que e encontrado en mi caso, es que me ponia en los archivos que yo queria unos 3 … puntos que no se demasiado bien de donde salian.

    en mi caso los e podido eliminar añadiendo:
    “.”
    en esta Array:
    $no_mostrar=Array(“”,”.”

    Thanks, saludos.

  8. Pues no se que serán los 3 puntos, pero puede que sean las carpetas “.” y “..”, “.” que es la carpeta actual y “..” que es la carpeta padre.

    Pero en teoría el meter la cadena vacía en el array de $no_mostrar hace que no aparezcan los directorios . y .. , porque se encuentra el carácter “.” y su extensión es “”.

    Ya te digo, a mi no me salia cuando hice el ejemplo :P

    Gracias por avisar!

  9. Muchas gracias

Deja un comentario

Your email address will not be published / Required fields are marked *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>