[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!!!
Joan
11 de marzo de 2011 - 14:24
De lujo tio. Un placer haber compartido contigo años de programación jaja
xhiena
12 de marzo de 2011 - 14:13
xDDD un placer para mi tambien :D
PETER
7 de agosto de 2011 - 00:44
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
xhiena
7 de agosto de 2011 - 11:35
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)) {
Carlos
25 de diciembre de 2011 - 06:18
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 ” “
Xhiena
25 de diciembre de 2011 - 12:28
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
Carlos
25 de diciembre de 2011 - 22:08
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.
xhiena
25 de diciembre de 2011 - 22:29
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!
Jonathan
23 de enero de 2013 - 03:06
Muchas gracias
DWS
23 de enero de 2013 - 16:23
gracias!!
Lenin Morales
29 de junio de 2017 - 22:08
este codigo no me esconde lo que necesito, tengo un fichero “fulano-view.php” y quiero ocultar “-view.php”, así que este codigo no me sirve para esto
xhiena
29 de junio de 2017 - 22:44
Puedes usar strstr (http://php.net/manual/en/function.strstr.php) para saber si “-view.php” esta en el nombre del fichero
Lenin Morales
29 de junio de 2017 - 23:00
Gracias amigo, con eso lo resolvi de maravilla, te lo agradezco
Gustavo Arias
6 de noviembre de 2017 - 18:33
Eres un ink master! te felicito