Foros del Web » Programando para Internet » PHP »

Problemas con lectura de directorio de archivos

Estas en el tema de Problemas con lectura de directorio de archivos en el foro de PHP en Foros del Web. Buenas tardes: Hace poco he empezado el estudio de PHP y luego de un tiempo empecé un pequeño proyecto, pero sucede que no responde como ...
  #1 (permalink)  
Antiguo 08/04/2017, 16:45
Avatar de freesoftwarrior  
Fecha de Ingreso: marzo-2006
Mensajes: 362
Antigüedad: 18 años, 1 mes
Puntos: 10
Problemas con lectura de directorio de archivos

Buenas tardes:
Hace poco he empezado el estudio de PHP y luego de un tiempo empecé un pequeño proyecto, pero sucede que no responde como esperaba y no logro encontrar la causa.

Se trata de 2 archivos php, uno lee el contenido de una carpeta y lo muestra, y el otro, ubicado dentro de la carpeta mencionada, abre uno a uno los archivos TXT y lee la primera línea. Nada complicado.

El código del primer archivo es el siguiente

directorio.php
Código PHP:
<?php
$directorio 
opendir("./txt"); //ruta actual
$filas 1;
while (
$archivo readdir($directorio)) //obtenemos un archivo y luego otro sucesivamente
{
    if (
is_dir($archivo))//verificamos si es o no un directorio
    
{
        
//no pasa nada-
    
}
    else
    {
        echo 
$filas."&nbsp;&nbsp;&nbsp;".$archivo "<br />";
        
$filas++;
    }
}
?>
El resultado es un listado de 16 archivos, 15 txt y 1 php. Hasta ahí todo normal y sin problemas.

Al ejecutar el archivo PHP que está dentro de dicha carpeta, debería de mostrarme 15 contenidos, pero sólo me muestra 13. Y siempre son los mismos archivos los que omite. El código del archivo PHP es el siguiente:

Código PHP:
<table width="100%" border="1" cellspacing="0" cellpadding="0" align="center">
    <tr>
<?php
    $directorio 
opendir("."); //ruta actual
    
$contador 1;    //para crear solamente 5 columnas en la tabla
    
    
while ($archivo readdir($directorio)) //obtenemos un archivo y luego otro sucesivamente
    
{
        if (
is_dir($archivo)) //verificamos si es o no un directorio
        
{
            
//no pasa nada
        
}
        else
        {
            if (
$contador 5)
            {
                
//cerramos la fila
                
echo "</tr>";
                
$contador 1;
            }
            else
            {
                if (
$archivo=="listado.php")
                {
                    
//esto es para pasar por alto el archivo php
                
}
                else
                {
                    
//abrimos el archivo y leemos la primera línea
                    
$fp fopen($archivo"r");
                    
$linea fgets($fp);
                    
fclose($fp);
                    
                    if (
$contador == 1)
                    {
                        
//abrimos una nueva fila
                        
echo "<tr>";
                    }
                    
                    
$contador++;
?>
        <td>
<?php
                    
echo $archivo."<br>";
?>
            <iframe src="<?php echo $linea?>media/?size=l" width="250" height="400" scrolling="no" frameborder="1"></iframe>
        </td>
<?php
                
}    //if listado.php
            
}    //if contador
        
}    //if is_dir
    
}    //while
    
    
if ($contador <=5)
    {
        
//no pasa nada
    
}
    else
    {
        echo 
"</tr>";
    }
?>
</table>
En cada archivo TXT hay un link a una imagen publicada en Instagram, nada que ocasione problemas al cargar, sin embargo, no me muestra todos. Inicialmente había probado con 92 y sólo cargaban 76, así que separé los 15 que no eran leídos por si encontraba algún error, pero al probar con los 15 mencionados, omitía siempre 2. Sin embargo, al dejar los 2 que siempre omitía, los muestra sin ningún problema.

Eso me hace pensar que algo esta mal en el código, pero por más que le doy vueltas, no encuentro que puede ser.

Espero me puedan dar una orientación al respecto.

Un saludo desde Lima, Perú
Bendiciones
  #2 (permalink)  
Antiguo 09/04/2017, 00:37
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Problemas con lectura de directorio de archivos

Cita:
Iniciado por freesoftwarrior Ver Mensaje
Buenas tardes:
Hace poco he empezado el estudio de PHP y luego de un tiempo empecé un pequeño proyecto, pero sucede que no responde como esperaba y no logro encontrar la causa.

Se trata de 2 archivos php, uno lee el contenido de una carpeta y lo muestra, y el otro, ubicado dentro de la carpeta mencionada, abre uno a uno los archivos TXT y lee la primera línea. Nada complicado.

El código del primer archivo es el siguiente

directorio.php

El resultado es un listado de 16 archivos, 15 txt y 1 php. Hasta ahí todo normal y sin problemas.

Al ejecutar el archivo PHP que está dentro de dicha carpeta, debería de mostrarme 15 contenidos, pero sólo me muestra 13. Y siempre son los mismos archivos los que omite. El código del archivo PHP es el siguiente:

En cada archivo TXT hay un link a una imagen publicada en Instagram, nada que ocasione problemas al cargar, sin embargo, no me muestra todos. Inicialmente había probado con 92 y sólo cargaban 76, así que separé los 15 que no eran leídos por si encontraba algún error, pero al probar con los 15 mencionados, omitía siempre 2. Sin embargo, al dejar los 2 que siempre omitía, los muestra sin ningún problema.

Eso me hace pensar que algo esta mal en el código, pero por más que le doy vueltas, no encuentro que puede ser.

Espero me puedan dar una orientación al respecto.

Un saludo desde Lima, Perú
Bendiciones
Bueno, lo primero que te aconsejo es que depures tu código, pues así reducirá los riesgos a fallos.

Lo segundo que te recomiendo es que te acostumbres separar el codigo php del html pues reduces el tiempo de programacion al obtener menos fallos a la hora de ejecutar el codigo, pues asi es muy facil equivocarse y aumentas la posiblidad de tener un codigo mas feo con lo cual mas posibilidades a sufrir bugs.

Y ya por ultimo tambien te aconsejo a que leas cada linea de codigo que creas y lo vayas ejecutando mentalmente para asi darte cuenta de las incongruencias de tu codigo.

Por ejemplo cuando dices si el contador es menor a 5, cierra la fila y vuelve el contador a 1... si lo ejecutas mentalmetne, cuando entras en el loop tienes un contador valor 1 y como es menor a 5, estas cerrando la fila por cada archivo ya que el contador siempre valdra 1.

El orden de ejecucion del codigo es erroneo y puede llevar a equivocaciones futuras pues en mitad del proceso esta evitando el archivo php cuando puedes hacerlo junto con la condicional inicial que comprueba si es un directorio. A parte no estas utilizando <td> para cada celda.

Asi que quzias el fallo te venga por ahi, por lo mal que se crea la tabla porque lo demas parece estar bien aunque no sea la mejor manera de imprimir esos datos.

Asi lo haria yo:

Código PHP:
Ver original
  1. <?php
  2. $directorio = opendir("./txt");
  3. $contador = $filas = 1;
  4. $html = $archivos = array();
  5.  
  6. while ($archivo = readdir($directorio)) {
  7.     if(is_dir($archivo)) continue;
  8.    
  9.     # listamos los archivosen un array
  10.    $archivos[] = $archivo;
  11.  
  12.     //abrimos el archivo y leemos la primera línea
  13.     $fp = fopen($archivo, "r");
  14.  
  15.     if($contador  == 1 ) $html .= '<tr>';
  16.  
  17.     $html .= '<td>' . fgets($fp) . '</td>';
  18.     fclose($fp);    
  19.  
  20.     If($contador == 5) {
  21.         $html .='</tr>';
  22.         $contador = 1;
  23.     }
  24.  
  25.    $contador++;
  26. }
  27.  
  28. # imprimimos en pantala la list de archivos
  29. foreach ($archivos as $archivo) {
  30.      echo  $filas."&nbsp;&nbsp;&nbsp;".$archivo . "<br />";
  31.      $filas++;
  32. }
  33. ?>
  34.  
  35. <table width="100%" border="1" cellspacing="0" cellpadding="0" align="center">
  36.       <?=$html ?>
  37. </table>

Eso te deberia de funcionar bien y ademas, si te das cuenta, con solo ese codigo te estas ahorrando el 2° archvo, asi tienes todo en un solo archivo, no he puesto lo del iframe pq no entiendo la logica de tenerlo ahi.

Y aquí hay otro tema, te faltaria añadir la logica para cerrar la fila en caso que el num de archivos no sea un multiplo de 5

Última edición por Triby2; 09/04/2017 a las 09:55
  #3 (permalink)  
Antiguo 09/04/2017, 14:11
alvaro_trewhela
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problemas con lectura de directorio de archivos

Entiendo +/- que es lo que quieres hacer... pero por lo que veo te recomiendo usar bases de datos y no trabajar con archivos y directorios, estos no están hechos para guardar datos, sino contenidos.

En php.net te explican como se hace un correcto listado de un directorio (busca por readdir), yo solo lo acomodé para ti:

Código PHP:
Ver original
  1. <?php
  2.  
  3. $ruta = "directorio/sub_directorio"; //Directorio sistema (sin / final)
  4.  
  5. if ($abrir = opendir($ruta)) {
  6.     while (false !== ($archivo = readdir($abrir))) {
  7.         if ($archivo != "." && $archivo != ".." && !is_dir("$ruta/$archivo") && $archivo != "listado.php") {
  8.         echo "$archivo<br/>";
  9.         }
  10.     }
  11. closedir($abrir);
  12. }
  13. ?>

Todo esto lo resumo en un solo if para evitar lo que haces tu:

Código PSEUDO:
Ver original
  1. if(a == b){
  2. //hacer nada
  3. }
  4. else{
  5.     if(c == d){
  6.     //hacer nada
  7.     }
  8.     else{
  9.         if(e == f){
  10.         //hacer nada
  11.         }
  12.         else{
  13.         //hacer
  14.         }
  15.     }
  16. }

Entendiendo el if, antes lo único raro que aparece son esos puntitos, explicación:

"." Hace referencia al directorio mismo
".." Hace referencia al directorio "padre" o predecesor

Se que esto sucede en win y unix, bueno para este caso diremos que no son elementos del directorio.

Bueno para listar el elemento sabemos que no puede ser "." Y no puede ".." Y no puede ser un directorio Y no pede ser "listado.php"

Si te fijas usamos las palabras "Y", y "no puede ser" (que es lo mismo que negar) estos son operadores condicionales que en php sus simbolos son && y ! respectivamente es por eso la sintaxis de ese if. fué necesario negar todo para conseguir ese único if, Debes conocer y manejarte en tablas de verdad y si es así entenderás el por que

--- fin explicación

Algunos puntos a considerar

1.- Te entrego el código no para resolver tu problema sino para que aprendas, no explicaré nada, salvo un par de puntos, es tu deber investigar comprender.

2.- Haré todo en un solo código por lo tanto eliminaré ese "listado.php" del sistema y del directiro

3.- Usas is_dir por lo que entiendo que usas subdirectorios en tu sistema

4.- Hay que ser rigurosos, en tu sistema pueden faltar columnas dentro de una fila, es decir, si tienes 7 elementos y 5 columnas sucederá esto:

col1 | col2 | col3 | col4 | col5
elm1 | elm2 | elm3 | elm 4 | elm5
elm6 | elm7

Que estéticamente no haya problema no quiere decir que esté bien

5.- Usas 5 columnas no se porque debe ser cosa tuya, yo seré felxible con las columnas con una variable, porque me ahorrará mucho trabajo, y además tienes como herramienta para cambiar rápidamente la cantidad de columnas.

6.- Usaré scandir en cambio de readdir, me es más fácil, allá quienes no le guste mi decición y método.

Código PHP:
Ver original
  1. <?php
  2.  
  3. //Config sistema
  4. $ruta = "ruta/asd"; //ruta del sisitema sin / final
  5. $columnas = 7; //numero de columnas
  6. //Fin cofig
  7.  
  8. echo '<table width="100%" border="1" cellspacing="0" cellpadding="0" align="center">
  9. <tr>';
  10.     for($k=1;$k<=$columnas;$k++){
  11.     echo "<td>columna $k</td>";
  12.     }
  13. echo '</tr>';
  14.  
  15. $dirScan = scandir($ruta);
  16. $archivos = array();
  17. $indiceArchivos = -1;
  18.  
  19. for($k=0;$k<sizeof($dirScan);$k++){
  20.     if($dirScan[$k] != "." && $dirScan[$k] != ".." && !is_dir("$ruta/".$dirScan[$k])){
  21.     $archivos[++$indiceArchivos] = $dirScan[$k];
  22.     }
  23. }
  24.  
  25. $largo = sizeof($archivos);
  26. $faltantes = $columnas-($largo%$columnas);
  27. if($faltantes == $columnas){ $faltantes = 0; }
  28. $contador = 0;
  29. $contadorFinal = 0;
  30.  
  31. for($k=0;$k<$largo;$k++){
  32. $contador++;
  33. $contadorFinal++;
  34.     if($contador == 1){ echo "<tr>"; }
  35.  
  36. $archivoCompleto = "$ruta/".$archivos[$k];
  37. $filas = explode("\r\n", fread(fopen($archivoCompleto, "r"), filesize($archivoCompleto))); //hay otro método, que no recuerdo
  38. $recurso = $filas[0];
  39.  
  40. echo "<td>
  41. Archivo: ".$archivos[$k]."<br/>Recurso: $recurso
  42. </td>"; //aqui cambias por tu iframe, yo usé esto para probar
  43.  
  44.     if($contadorFinal == $largo){
  45.         for($l=0;$l<$faltantes;$l++){
  46.         echo "<td></td>";
  47.         }
  48.     }
  49.  
  50.     if($contador == $columnas){ echo "</tr>"; $contador = 0; }
  51. }
  52.  
  53. echo '</table>';
  54.  
  55. ?>

A mi me funciona perfecto, lo que hice fue simular un directorio sistema con este código

Código PHP:
Ver original
  1. <?php
  2.  
  3. //config emulador
  4. $ruta = "ruta/asd"; //ruta sin / final y debe ser la misma que el sistema
  5. //fin config
  6.  
  7. $generar = rand(10,50); //generaremos una cantidad de archivos
  8. for($k=0;$k<$generar;$k++){
  9. $archivo = "$ruta/archivo".md5(rand(100,1000)).".txt"; //crearemos un archivo random
  10.  
  11. //aquí creé un contenido ejemplo
  12.  
  13. $cont = md5(rand(1,10000))."\r\n";
  14. $cont .= "Linea2: ".md5(rand(1,10000))."\r\n";
  15. $cont .= "Linea3: ".md5(rand(1,10000))."\r\n";
  16. $cont .= "Linea4: ".md5(rand(1,10000))."\r\n";
  17. $cont .= "Linea5: ".md5(rand(1,10000));
  18.  
  19. //fin contenido
  20.  
  21. fwrite(fopen($archivo, "w"),$cont); //crear archio y escribir contenido
  22. }
  23.  
  24. $generar = rand(10,50); //generaremos una cantidad subdirectorios para ver que el sistema funcione bien
  25.  
  26. for($k=0;$k<$generar;$k++){
  27. $dir = "$ruta/".md5(rand(100,1000)); //nuevo subdirectorio aleatorio
  28. @mkdir($dir); //crear subdirectorio
  29. }
  30.  
  31. //usé md5 para que se vean nombres no numeritos
  32.  
  33. ?>

No simules esto en tu sistema o se llenará de archivos basura, puedes abrir los archivos generados para que veas como están completados y estructurados.

PD1: Expliqué todo muy rápido, por lo que si algo no concluí o expliqué mal o pasé por alto disculpa

PD2: Me demoré 20mins en el código puede haber incongruencias y/o métodos poco eficientes, no valide rigurosamente.

PD3: Si no es lo que querías disculpa es lo que yo interprete. y me debes 30 mins de vida jajaja

Edito: me falto cerrar la tabla en el código jajaja

Última edición por alvaro_trewhela; 09/04/2017 a las 15:09
  #4 (permalink)  
Antiguo 09/04/2017, 15:48
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problemas con lectura de directorio de archivos

Tu problema es solo de lógica, porque:

Código PHP:
Ver original
  1. if ($contador > 5)
  2.             {
  3.                 //cerramos la fila
  4.                 echo "</tr>";
  5.                 $contador = 1;
  6.             }
  7.             else

Si el contador es igual a 5, lo reinicias, cierras la fila y.... omites el archivo!!!

Sobra el else en ese if.

Aparte, estás manipulando el contador antes de saber si vas a tomar en cuenta el archivo o no, lo más adecuado es que desde que obtienes hagas las comparaciones adecuadas:

Código PHP:
Ver original
  1. if (is_dir($archivo) || $archivo == 'listado.php') // verificamos si es directorio o archivo php
  2.         {
  3.             //no pasa nada
  4.         }
  5.         else
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: directorio, lectura
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:57.