Ver Mensaje Individual
  #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