Recorrer directorio de archivos con PHP
Todo programador experimentado en alguna ocasión se tiene que enfrentar a tener que realizar un script que recorra todo un servidor o parte de él para realizar una función específica, como por ejemplo eliminar algún código malintencionado que pudiera estar en todos tus archivos o añadir un código necesario en todos los archivos.
En este artículo vamos a ver una función recursiva muy interesante para recorrer todos los directorios y archivos de una ruta base.
La función es la siguiente:
function showFiles($path){
$dir = opendir($path);
$files = array();
while ($current = readdir($dir)){
if( $current != "." && $current != "..") {
if(is_dir($path.$current)) {
showFiles($path.$current.'/');
}
else {
$files[] = $current;
}
}
}
echo '<h2>'.$path.'</h2>';
echo '<ul>';
for($i=0; $i<count( $files ); $i++){
echo '<li>'.$files[$i]."</li>";
}
echo '</ul>';
}
Esta función recibe como único parámetro la ruta o el directorio base a analizar o recorrer.
Lo primero que hacemos es abrir el directorio facilitado por parámetro y recorrer sus archivos y demás directorios dentro de él.
La recursividad se ejecutará cuando el elemento que se está analizando se trata de otro directorio, entonces, volveríamos a llamar a la función para recorrer lo que haya dentro de este último directorio.
En el caso de que estemos analizando un archivo lo que hacemos es guardarlo en un array.
Si quisieramos simplemente analizar solo un tipo de archivos, como por ejemplo todos aquellos con extensión .php deberemos añadir una condición antes de guardar en el array los archivos:
if(eregi(".*\.php", $path.$current))
En este caso solo procesaremos o mostraremos los archivos .php.
En el ejemplo que se ilustra a continuación vamos a analizar el directorio raiz llamando a esta función de la siguiente forma:
showFiles('./');
Hola que tal estuve mirando tu código de como recorrer archivos. Esta muy interessante.
Pero quisiera tu ayuda con respecto a un codigo que he desarrollado en php para recorrer una base de datos en postgresql.
el asunto es que el codigo tiene una falla al recorrer la BDD.
este es el codigo:
$seleccionados = @pg_query($conexion,$recibos);
while($select2 = @pg_fetch_array($seleccionados))
{
$edificio = $select2[‘nombre’];
$nombres = $select2[‘nombres’];
$apellidos = $select2[‘apellidos’];
$monto = $select2[‘total’];
$alicuota = $select2[‘alicuota’];
$descr = $select2[‘descripcion’];
$tipogasto=$select2[‘cod_tipo_gasto’];
$contrasena=$select2[‘contrasena’];
if ($select2[‘nroapto’]!=$nroapto)
{
$pdf->Line($pdf->GetX(), $pdf->GetY(), 205, $pdf->GetY());
$pdf->Ln(3);
$pdf->Cell(45,1,»Total Apartamento—>»,0,0);
$pdf->Cell(49,4,number_format($TotalApto1,2,’,’,’.’),0,1,’C’);
// $pdf->Cell(80,4,number_format($TotalApto1,2,’,’,’.’),0,1,’C’);
$calreser = $TotalApto1 * .10;
$pdf->Cell(45,1,»Apartado Reserva 10%—>»,0,0);
$pdf->Cell(49,4,number_format($calreser,2,’,’,’.’),0,1,’C’);
$alicuoreser = $calreser * .10 * $alicuota / 10;
// $pdf->Cell(135,4,number_format($alicuoreser,2,’,’,’.’),0,1,’R’);
// $totaldistr = $TotalApto1 + $calreser;
$totaldistr = $TotalApto1 * $alicuota/100;
$TotAlicuota3 = $TotalApto1 + $calreser;
$pdf->Cell(45,1,»Total Gastos Comunes—>»,0,0);
$pdf->Cell(29,4,number_format($TotAlicuota3,2,’,’,’.’),0,1,’R’);
$totaldistr = $TotAlicuota3 * $alicuota/100;
// $pdf->Cell(45,1,»Su Alicuota—>»,0,0);
// $pdf->Cell(49,4,number_format($totaldistr,2,’,’,’.’),0,1,’C’);
$TotalApto = 0;
$pdf->AddPage();
$pdf->SetFont(‘Arial’,’B’,6);
// $pdf->Cell(20,4,’Cédula:’);
// $pdf->Cell(26,4,$select2[‘cedula’],0,1,’R’);
$pdf->Cell(20,4,’Nombres:’,0);
$pdf->Cell(26,4,$nombres,0,1,’L’);
$pdf->Cell(20,4,’Apellidos:’,0);
$pdf->Cell(26,4,$apellidos,0,1,’L’);
$pdf->Cell(20,4,’Nro Apto:’,0);
$pdf->Cell(26,4,$select2[‘nroapto’],0,1,’L’);
$pdf->Cell(20,4,’Alicuota:’,0);
$pdf->Cell(26,4,$alicuota,0,1,’L’);
///////rutina que permite sumar para obtener la deuda por Nro de Apartamento
// $deuda = $select2[‘totald’];
// $deuda3 = $deuda;
$pdf->Cell(20,4,’Deuda:’,0);
$pdf->Cell(26,4,number_format($monto,2,’,’,’.’),0,1,’L’);
$pdf->Cell(20,4,’Clave:’,0);
$pdf->Cell(26,4,$contrasena,0,1,’L’);
$pdf->Cell(20,4,’Edificio:’,0);
$pdf->Cell(26,4,$edificio,0,1,’L’);
$deuda3 = 0;
//////////totaliza por nro de Apartamento y del Edificio
$listbina = @pg_query($conexion,$totEdifi);
while($select3 = @pg_fetch_array($listbina)){
$TotalEdificio = $select3[‘totaledificio’];
}
$pdf->Line($pdf->GetX(), $pdf->GetY(), 205, $pdf->GetY());
$pdf->Ln(7);
$pdf->Cell(30,4,’Gasto’,0,’C’);
// $pdf->Cell(40,4,’Egresos’,0,0,’R’);
// $pdf->Line($pdf->GetX(), $pdf->GetY(), 205, $pdf->GetY());
$pdf->Ln(6);
}
$monto = $select2[‘monto’];
//Calculo de la alicuota//////////////////////////////////////
$TotalEdificio += $monto;
$TotalApto +=$monto;
$TotalApto1 = round($TotalApto);
// if ($alicuota != 0.85 || $alicuota != 1.11){
// }
$alicuo = $monto * .10 * $alicuota / 10;
$nroapto = $select2[‘nroapto’];
$pdf->SetFont(‘Arial’,’I’,6);
// $pdf->Cell(45,4,$select2[‘descripcion’],0,0,’L’);
$pdf->Cell(45,4,$descr,0,0,’L’);
if ($tipogasto == 1)
{
$pdf->Cell(10,4,number_format($monto,2,’,’,’.’),0,0,’R’);
}
else
{
$monto1 = $select2[‘monto’];
$pdf->Cell(60,4,number_format($monto1,2,’,’,’.’),0,1,’R’);
}
$pdf->Ln(3);
}
$pdf->Line($pdf->GetX(), $pdf->GetY(), 205, $pdf->GetY());
$pdf->Ln(3);
$pdf->Cell(45,1,»Total Apartamento—>»,0,0);
$pdf->Cell(49,4,number_format($TotalApto1,2,’,’,’.’),0,1,’C’);
$calreser = $TotalApto1 * .10;
$pdf->Cell(45,1,»Apartado Reserva 10%—>»,0,0);
$pdf->Cell(49,4,number_format($calreser,2,’,’,’.’),0,1,’C’);
$TotAlicuota3 = $TotalApto1 + $calreser;
$pdf->Cell(40,1,»Total Gastos Comunes—>»,0,0);
$pdf->Cell(34,4,number_format($TotAlicuota3,2,’,’,’.’),0,1,’R’);
$totaldistr = $TotAlicuota3 * $alicuota/100;
// $pdf->Cell(45,1,»Su Alicuota—>»,0,0);
// $pdf->Cell(49,4,number_format($totaldistr,2,’,’,’.’),0,1,’C’);
$pdf->Ln(3);
$pdf->Line($pdf->GetX(), $pdf->GetY(), 205, $pdf->GetY());
$pdf->Ln(2);
// $pdf->Cell(50,1,»Saldo Anterior»,0,0,’R’);
// $pdf->Cell(50,1,»Cargo del Mes»,0,1,’R’);
$pdf->Ln(2);
$resultreser = @pg_query($conexion,$reserva);
while($selectre = @pg_fetch_array($resultreser)){
// $pdf->Cell(45,1,»Fondo de Reserva»,0,1,’L’);
// $totalreserva1 = $selectre[‘totalreserva’];
// $pdf->Cell(85,4,number_format($totalreserva1,2,’,’,’.’),0,1,’C’);
//Seguir aqui
}
/* $pdf->Cell(45,1,»Total Edificio—>»,0,0);
$pdf->Cell(163,4,number_format($TotalEdificio,2,’,’,’.’),0,1,’C’);
$TotalEdificio = 0;
///////////////////////////////////////////////////////////////////////////////////////
*/
//$pdf->Output(sumireg);
$pdf->Output();
//$pdf->Output();
$pdf->Close();
?>
cuando el codigo llega al
if ($select2[‘nroapto’]!=$nroapto)
debiera asignar multiplicando la alicuota al primer registro y pasar o leer el siguiente, eso no lo esta haciendo.
la verdad no se cual es el problema.
Hola,
Si todavía no has conseguido resolver este asunto, envíanos un ticket al departamento de soporte técnico ubicado en:
https://www.jamodules.com/es/soporte
Para que podamos revisar detenidamente tu petición.
Saludos
Justo lo que buscaba, incluso funciona con carpetas que tienen miles de archivos…
Gracias!
Saludos, josé… queria saber si me puedes ayudar …
quiero hacer un select que al comenzar a escribir me busque dentro de un directorio que tengo de musica y me muestre la canción eun un div o algo… uso tu codigo y bien, logro ver la carpeta con la muscia me la lista, pero necesito crearle un indice para poder separar las canciones… He logrado hace un explode y sacar de la misma cancion el nombre del artista y el titulo, y la misma direccion en si que es la cancion… pero no logro armas para que al esceribir en el select me busque en esta lista con tu codigo la cancion que escriba, como podria hacer eso?…
P.D.: el select con el buscador lo tengo listo solo me falta armas que al escribir pueda buscar la cancion… gracias
Hola,
Parece ser que lo que necesitas es hacer una búsqueda en el directorio, verdad? Una posible solución podría ser recorrer el directorio y hacer una comparación con un if del nombre del fichero con lo que se está escribiendo en el buscador.
Saludos
Buenos dias. Gracias por tu trabajo!!
No encuentro la manera de buscar directorios que empiecen con una cadena concreta. (lo que en dos seria ‘dir carpeta*.’
Tengo las carpetas, en un mismo nivel, con nombre ‘XX 001′,’XX 002’, ‘XX test nn’ y me interesaria obtener todas las carpetas que empiezan con ‘XX’.
globr(‘XX*.’) no funciona.
Alguna sugeréncia? Gracias de nuevo!
Hola,
Puedes usar la función substr para dividir el nombre de las carpetas con el objetivo de coger los 2 primeros carácteres. En el siguiente enlace tienes varios ejemplo de como funciona la función substr con PHP:
https://www.jose-aguilar.com/blog/dividir-cadenas-substr-php/
Saludos
Si gracias, fue por lo que opte, fue la solución mas rápida.
Tengo otra pregunta, como puedo hacer la búsqueda de archivos en una unidad de red o memoria USB?
Gracias por la pronta respuesta.
Saludos.
hola, estoy utilizando tu codigo para buscar un archivo especifico y que despues me regrese la ruta, ya lo hice con esto>
if(eregi(‘@-‘.$farchivo.’.pdf’, $path.$current)){
$files[] = $current; }
el problema que tengo es que quisiera que buscara otro archivo mas es decir archivo2, pero me manda error cada vez que lo intenta agregue esto
if(eregi(‘@-‘.$farchivo.’.pdf’, $path.$current) || eregi(‘@-‘.$farchivo2.’.pdf’, $path.$current))
y me manda error cuando encuentra los dos
Hola,
No he tenido la oportunidad de ver todo tu código pero yo lo que haría personalmente para este caso específico es hacer una función y llamarla 2 veces, una con cada archivo.
Saludos
buenas tardes,
yo busco un codigo que me permita moverme dentro de todos los directorios, carpetas e incluso llegar a la raiz del hosting. y tenga la opcion de descargar el archivo seleccionado y/o poder editar el archivo en el mismo hosting sin necesidad de descargarlo.
claro tenga un usuario y clave que me pida al inicio. ejemplo mi ruta es:
http://www.miweb.com/verlistado.php
al ingresar a ese link me pida clave y usuario que yo eh colocado dentro de verlistado.php y al ser correcto recien me de como resultado la visualizacion de todos los archivos en esa carpeta y poder mover entre directorios.
usted tendra ese script. a veces se me es complicado modificar algun cambio en la web . pues debo descargarlo y luego volver a subirlo mediante acceso al ftp.
y es todo un tema.
gracias espero me haya comprendido.
Hola buenos días,
Existe una herramienta que se instala en tu servidor que te permite administrar todos los ficheros. El problema es que ahora no recuerdo el nombre. Si buscas en google «administrador de archivos php» aparecen varias opciones que quizá te puedan interesar. File Thingie creo que es lo que buscas.
Saludos
Hola José quiero saber si podrás ayudarme con algo que no encuentro en la red. Estoy haciendo un editor para un blog y necesito señalar la ruta de unas imágenes de cabeceras de notas. Joomla tiene un botón que te permite recorrer el directorio y señalar la imagen guardando el path de la misma. Estoy buscando esa rutina, pero solo me salen resultados de como subir archivos al sitio. Las imágenes ya las subo por ftp, solo necesito que el usuario pueda buscarlas en el árbol de carpetas del sitio y cargar el path en una variable o un campo de texto del formulario. Muchas gracias.
Hola buenas tardes,
En este caso, será necesario que nos envíes una petición a blog@jose-aguilar.com con todos los detalles del problema y estudiaremos cual debe ser el procedimiento para facilitar una solución a medida.
Saludos
Buenas, lo primero gracias por la función.
Tengo un problema y es que sólo me imprime los nombres de las carpetas pero nada de su contenido. He cogido tu ejemplo tal cuál, sólo le he pasado por parámetro el path.
Qué es lo que puedo estar haciendo mal.
Muchas gracias por todo
Hola buenas tardes,
Pues nos interesaría mucho ver el código que estás poniendo. Así sin ver nada poco te podemos decir.
Si has puesto lo mismo que el ejemplo te tocará debugar y ver que se está guardando en este array en cada llamada recursiva:
$files[] = $current;
SAludos
Que tal josé estoy realizando una galería de fotos php utlizando lightbox con imágenes estáticas me despliega y agrande las fotos sin ningún problema en la página principal pero al utilizar bd o que se manden llamar de una carpeta no me hace el efecto de agrandar las fotos que estaré haciendo mal, que me falta o sobra cualquier orientación que me puedas dar te lo agradeceré saludos !!!!!
HOla, si nos facilitas la url donde estés desarrollando seguramente podamos ver rápido que problema hay para darte una mejor orientación. Saludos
excelente blog, me gusto tu idea de i documentando y compartiendo todo lo que vas aprendiendo, felicidades !
Jose.
tengo una duda.
¿donde pongo la dirección de la carpeta que quiero consultar?
como único parámetro de la llamada a la función:
showFiles(‘./’);
hola, nose si me podrias explicar como hacerle para que cuando un usuario se registre se genere una carpeta con su nombre de usuario y despues vaya al sistema upload suba su archivo y el archivo se guarde en su carpeta y despues aparezca ese archivo en su perfil.
Saludos!
Hola,
En el código donde controlas el registro de usuarios deberás añadir el código para crear la carpeta con el nombre del usuario. Puedes revisar el siguiente artículo:
http://www.jose-aguilar.com/blog/crear-carpetas-o-directorios-con-php/
Y para subir archivos a esa carpeta te puedes guiar con el siguiente artículo:
http://www.jose-aguilar.com/blog/upload-de-archivos-con-php-version-2-0/
Espero que te sirva,
Saludos