Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

 
 
Herramientas Buscar en Tema Desplegado
  #2  
Antiguo 21-08-2005
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.141
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Con más voluntad de ayudar que otra cosa se me ha ocurrido que tal vez pudieras procesar el archivo a trozos. Bien es verdad que de la manera en que se me ha ocurrido, como digo, primero tendrías que leer todo el archivo de una vez, pero no parece haber demasiados problemas: he probado con un archivo de texto que he creado con el NotePad costándome lo suyo, pues al cabo he conseguido que este contuviera más de 50 MB de texto.

Una vez cargado el archivo en una variable de tipo "TStream", he pensado en ir leyéndolo poco a poco, guardando cada "trozo" en una variable de tipo "TStreamString". Como la "secuencia" se realiza en un bucle "repeat", a cada paso por dicho bucle se contaría con un trozo del archivo, de los bytes que precisáramos en el "buffer" que preparamos para ir leyendo el contenido del archivo.

El tema está en que "la cosa" se desarrolla con bastante rapidez y, tal como podrás ver, sin que la interfaz sufra y se quede congelada, como suele decirse. Pero (hay más de un pero, este solo es uno de ellos) se me ocurre que tendrías problemas para procesar cada trozo del archivo en cuestión, puesto que tal vez no obtengas en los trozos "lo necesario" para poder procesarlo correctamente.

En definitiva, no sé si lo que he hecho, repito, con más voluntad de ayudar que otra cosa, ya lo habrías pensado tú, y, encuentras el mismo problema que refiero arriba, de cómo ajustar "los trozos" para que estos puedan ser procesados correctamente.

Bueno. El poco de código que he escrito es el siguiente:

Código Delphi [-]
  procedure ProcesarArchivo(rutArchivo: string);
  var
   stream: TStream;
   leidos: Cardinal;
   trozos: TStringStream;
   buffer: array [0..2048] of byte;
  begin
   stream := TFileStream.Create(rutArchivo, fmOpenRead);
   leidos := stream.Read(buffer, SizeOf(buffer));
   repeat
     Application.ProcessMessages;
     trozos := TStringStream.Create('');
     trozos.WriteBuffer(buffer, leidos);
     {
        trozos.DataString; ...
  
        Contiene los últimos 2048 bytes
        leídos del archivo en proceso.
     }
     leidos := stream.Read(buffer, SizeOf(buffer));
     trozos.Free;
   until (leidos = 0);
   stream.Free;
  end;
Si alguien puede corregir algo que no tarde en hacerlo. Se le agradecerá. Y, si he podido ser de utilidad en algo, pues mira tú qué bien. Y, si no he podido, pues lo siento. Otra vez será.

Actualización: Caramba, ahora me entero de que planteaste la cuestión en el Foro de C++ Builder... y yo pensando que era el de Delphi respondí como se puede ver... bueno, cabe que no sea demasiado complicado, si es que sirve de algo lo que he propuesto, hacer lo propio en C++ Builder, traduciendo de Delphi.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 21-08-2005 a las 10:49:27. Razón: (actualización)
Responder Con Cita
 


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 00:00:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi