Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Leer archivos binarios (https://www.clubdelphi.com/foros/showthread.php?t=87806)

BDWONG 27-02-2015 06:32:15

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 :D).

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 :D 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.

ElKurgan 28-02-2015 20:54:34

Gracias por compartir.

Creo que, con los ordenadores actuales, no hay problema de usar bloques más grandes.

Saludos

Kiranov 02-03-2015 22:38:54

Buenas tardes,

No se si tenga mucho que ver pero tego una duda: ¿si se optimiza el tamaño del bloque con el del cluster se optimizaria este proceso?
http://support.microsoft.com/kb/140365/es

Saludos!


La franja horaria es GMT +2. Ahora son las 13:10:40.

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