Ver Mensaje Individual
  #1  
Antiguo 27-02-2015
Avatar de BDWONG
BDWONG BDWONG is offline
Miembro
NULL
 
Registrado: nov 2013
Posts: 113
Reputación: 11
BDWONG Va por buen camino
Leer archivos binarios

Estaba leyendo el tema de manejo de ficheros con la clase TFilestream en la pagina delphi al limite
en especifico este:http://delphiallimite.blogspot.mx/20...exto-y_30.html

y me tope con que para leer archivos binarios y acelerar el proceso, se leia la informacion a travez de bloques y no byte a byte por cuestiones obvias de procesamiento y tiempo
( bueno eso entendi yo ).

En los ejemplos se ve que se crea un arreglo de 1024 bytes (equivalente a un kb), pero me percate de que si se leian bloques mas grandes era mas rapido pero tambien mas propensos ha que se escribiera "informacion basura",
es decir que si voy a leer archivos de unos de cientos kb no es necesario pedir bloques de 1024 o si voy a trabajar con varios gigabytes terminaria siendo algo deficiente ya que necesitaria un bloque de mayor tamaño, bueno eso creo.

Asi que se me ocurrio una idea que es la de leer un archivo creando un bloque a su medida ejemplo: si voy a leer 3000 bytes creo uno de ese tamaño

pero no se si es lo mas correcto hacer esto, asi que pido su sabiduria para saber si lo que digo tiene algo de logica o es una burrada o si me mantengo trabajando con bloques de 1024 bytes, bueno que para mi por ahora me van muy bien ya que no trabajo con informacion muy grande pero siempre es bueno saber.


les dejo el codigo:

Código Delphi [-]
var
fr,fw:TFileStream;
buffer:array of byte;
tam:integeR;
begin

  fr:=TFileStream.Create('dataoriginal.exe',fmOpenRead); //este archivo ya existe
  fw:=TFileStream.Create('nuevo.exe',fmCreate);//este archivo lo crearemos

  try

    SetLength(buffer,fr.Size);//crea un bloque a la medida
    tam:=fr.Size;//guarda el tamaño en bytes a leer
    
    while (fr.Position<=fr.Size-1) do
      begin
      fr.Read(buffer,tam);//leemso el fichero con el bloque a la medida
      fw.Write(buffer,tam);//creamos el mismo fichero con el bloque a la medida

    end;

  finally
    fr.Free;
    fw.Free;
  end;

  writeln('Escrito');
  readln;
end.

Última edición por BDWONG fecha: 27-02-2015 a las 06:41:10.
Responder Con Cita