Foros del Web » Programación para mayores de 30 ;) » Programación General »

no puedo leer algunos archivos

Estas en el tema de no puedo leer algunos archivos en el foro de Programación General en Foros del Web. Hola a todos. Resulta que estoy intentando hacer una aplicación de descarga de una actualización, como es muy grande lo quiero hacer de 50 en ...
  #1 (permalink)  
Antiguo 22/09/2004, 02:02
 
Fecha de Ingreso: septiembre-2004
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
no puedo leer algunos archivos

Hola a todos. Resulta que estoy intentando hacer una aplicación de descarga de una actualización, como es muy grande lo quiero hacer de 50 en 50 kb por modulo, en donde el usuario no se da cuenta.

El problema reside en que al intentar leer el fichero (es un fichero .exe) no me lo lee correctamente todo junto y lo tengo que hacer por partes (en cualquier archivo normal de texto todo es correcto). El código es el siguiente:

open (IDFICH,"<actuali.exe");
open (MANEJA,">descar.txt");
for($i=0;$i<500;$i++)
{
@contenido=<IDFICH>;
print MANEJA @contenido;
}
close (MANEJA);
close (IDFICH);

Lo tengo que hacer con un "For" pues al leer un poco me reconoce el final del fichero y se para.

Este no es el problema, es que al hacer esto me he dado cuenta que no lee todo, si no que se deja partes sin leer y no hay forma de descargar los 20 Mb que son y me salen solamente 10 Mb con los trozos que coge.

Alguien me puede ayudar? Gracias.
  #2 (permalink)  
Antiguo 22/09/2004, 05:31
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Es raro lo que quieres hacer...No probaste con un módulo de FTP del cpan?

El tema es que estás cargando todo el archivo en una variable, y el archivo pesa 20 megas !!!! Estás usando mucha pero mucha memoria, tal vez es eso que hace que en un momento dado no te permita usarla mas...me imagino que eso es pesadito !!!

Yo probaría algo así:

Código:
while (my $linea = <IDFICH>) {
       print MANEJA "$linea";
}
Con eso vas imprimiendo cada línea individualmente sin cargar todo en memoria, sino que vas cargando una por una, a la medida que van apareciendo.

Te recomiendo mucho que leas este artículo:
http://perlenespanol.baboonsoftware....vo/000112.html

Habla justamente de optimizar el uso de la memoria en perl, porque fijate que si es una aplicación CGI puede tener varias corridas en paralelo, con lo cual cada una usa 20 megas de la memoria un puñado de usuarios te quedas sin servidor.

Espero que te sirva
Saludos
__________________
Esteban Quintana
  #3 (permalink)  
Antiguo 22/09/2004, 05:51
 
Fecha de Ingreso: septiembre-2004
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
Desacuerdo No sirve

No pasa nada porque sea demasiado grande, pues solo necesito de 50 en 50 kb cargados en memoria.
El problema reside en que no sigue realizando el "WHILE" pues parece que se encuentra con el final del fichero y no sigue realizando el bucle, solamente coge 1 K que no es nada.
  #4 (permalink)  
Antiguo 22/09/2004, 06:36
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
Pero en donde está que lo haga cada 50 KB

en for($i=0;$i<500;$i++) ..mm...?

Y como sabe que debe empezar luego en el kb Nro 51 ?

Saludos
__________________
Esteban Quintana
  #5 (permalink)  
Antiguo 22/09/2004, 06:39
 
Fecha de Ingreso: mayo-2003
Mensajes: 328
Antigüedad: 21 años
Puntos: 0
Hola:

Lo que sucede es que el código que tienes no va a hacer lo que esperas:

Código:
  open (IDFICH,"<actuali.exe");
         open (MANEJA,">descar.txt");
              for($i=0;$i<500;$i++){
                   @contenido=<IDFICH>;
                   print MANEJA @contenido;
                }
         close (MANEJA);
  close (IDFICH);
Lo que estas haciendo es repitiendo 500 veces el proceso de copiar y escribir el archivo completo. Y solo puedes con 10 mb porque es todo lo que tu memoria esta liberando.

Más bien lo que deberías sería lo siguiente:

Código:
  open (IDFICH,"<actuali.exe");
         open (MANEJA,">descar.txt");
              for($i=0;$i<500;$i++){
                   $contenido=<IDFICH>;
                   print MANEJA $contenido;
                }
         close (MANEJA);
  close (IDFICH);
Esto copiaría solamente 500 líneas, no por esos son 50kb.

SALUDOS
__________________
Uriel Lizama, Perl Developer

Aprende Perl en Perl en Español.
  #6 (permalink)  
Antiguo 22/09/2004, 08:58
 
Fecha de Ingreso: septiembre-2004
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
Desacuerdo Voy a aclararlo un poco más

No me entendeis.

Lo del "for" no tiene nada que ver con los 50 kbs ni nada. Olvidarlo que es una forma para que saque algo más.

Voy a resumir la pregunta para que quede mas claro:

¿Hay algún problema con los ficheros binarios tipo exe para sacar el contenido y no se pare como si encontrase el final del fichero sin serlo?
  #7 (permalink)  
Antiguo 22/09/2004, 09:25
Avatar de monoswim
$moderador{'Esteban'}
 
Fecha de Ingreso: febrero-2002
Ubicación: Buenos Aires - Argentina
Mensajes: 8.762
Antigüedad: 22 años, 3 meses
Puntos: 90
NO, recién probé el script que te escribí antes y lo lee todo, solamente que lo probé con una imagen y me la deformó casi toda. Pero la leyó de principio a fin.

Lo de la deformación me parece que es porque DOS usa caracteres especiales para los saltos de línea, investiga sobre la función binmode.

binmode FILEHANDLE;

es para trabajar con archivos binarios.

Saludos
__________________
Esteban Quintana

Última edición por monoswim; 22/09/2004 a las 09:29
  #8 (permalink)  
Antiguo 22/09/2004, 11:25
 
Fecha de Ingreso: septiembre-2004
Mensajes: 4
Antigüedad: 19 años, 7 meses
Puntos: 0
Eureka

Por fin lo he conseguido.
Era eso, el caracter 26 y el 10 cuando va solo. Los sustituyo para hacer la descarga y los vuelvo a poner bien al final y asi no se le va la pinza.

Gracias por todo y a todos.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 23:29.