Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Comparación binaria de 2 archivos... (https://www.clubdelphi.com/foros/showthread.php?t=42054)

n3mohack 02-04-2007 19:24:04

Comparación binaria de 2 archivos...
 
Hola colegas....
hace bastante tiempo que no aparezco por acá, espero todos sigan tan bien como antes. Estoy alejado varios años de la programación y tengo un pequeño problemita que quiero resolver con un pequeño programa.. hacerlo en delphi obviamente.
Necesito comparar binariamente 2 archivos. Esto para saber si son idénticos o no.
Estoy tratando de usar la función CompareMem.. pero hasta ahora no logro dar en el clavo con su uso. :confused:

Gracias por cualquier aporte. :D

luisgutierrezb 02-04-2007 20:10:57

Podrias usar el TFileStream, usas 2 y vas comparando los buffers de lectura

mamcx 02-04-2007 20:34:31

Correle un hash (o un crc) a ambos archivos y comparas si son iguales... a menos que necesites un diff no hay que complicarse mas.

dec 02-04-2007 20:37:37

Hola,

Si necesitas un "diff" de esos que dice Casimiro puede interesarte estudiar el código fuente del componente "TDiff" de Angus Johnson.

seoane 02-04-2007 21:27:53

Un poco de codigo

Código Delphi [-]
function CompareFiles(strUno, strDos: String): boolean;
var
  Uno, Dos: TFileStream;
  BufUno, BufDos: Pointer;
  BytesRead: Integer;
begin
  Result:= FALSE;
  Uno:= TFileStream.Create(strUno,fmOpenRead or fmShareDenyWrite);
  try
    Dos:= TFileStream.Create(strDos,fmOpenRead or fmShareDenyWrite);
    try
      if Uno.Size = Dos.Size then
      begin
        GetMem(BufUno,10*1024);
        try
          GetMem(BufDos,10*1024);
          try
            while  TRUE do
            begin
              BytesRead:= Uno.Read(BufUno^, 10*1024);
              if (BytesRead <> Dos.Read(BufDos^, 10*1024)) then
                break;
              if BytesRead = 0 then
              begin
                Result:= TRUE;
                break;
              end;
              if not CompareMem(BufUno,BufDos,BytesRead) then
                break;
            end;
          finally
            FreeMem(BufDos);
          end;
        finally
          FreeMem(BufUno);
        end;
      end;
    finally
      Dos.Free;
    end;
  finally
    Uno.Free;
  end;
end;


// Por ejemplo
ShowMessage(BoolToStr(CompareFiles('c:\1.zip','c:\2.zip'),TRUE));

Y si te decides por el hash, muy útil si los dos archivos están en equipos distintos, aquí puedes encontrar una unit para calcularlo.
http://www.clubdelphi.com/foros/show...22&postcount=4

n3mohack 02-04-2007 23:38:37

Gracias Milenario,
Estaba probando otras funciones pero tu ejemplo me sirvió perfectamente. :)

Cita:

Empezado por seoane
Un poco de codigo


Código Delphi [-]
function CompareFiles(strUno, strDos: String): boolean;
var
Uno, Dos: TFileStream;
BufUno, BufDos: Pointer;
BytesRead: Integer;
begin
Result:= FALSE;
Uno:= TFileStream.Create(strUno,fmOpenRead or fmShareDenyWrite);
try
Dos:= TFileStream.Create(strDos,fmOpenRead or fmShareDenyWrite);
try
if Uno.Size = Dos.Size then
begin
GetMem(BufUno,10*1024);
try
GetMem(BufDos,10*1024);
try
while TRUE do
begin
BytesRead:= Uno.Read(BufUno^, 10*1024);
if (BytesRead <> Dos.Read(BufDos^, 10*1024)) then
break;
if BytesRead = 0 then
begin
Result:= TRUE;
break;
end;
if not CompareMem(BufUno,BufDos,BytesRead) then
break;
end;
finally
FreeMem(BufDos);
end;
finally
FreeMem(BufUno);
end;
end;
finally
Dos.Free;
end;
finally
Uno.Free;
end;
end;


// Por ejemplo
ShowMessage(BoolToStr(CompareFiles('c:\1.zip','c:\2.zip'),TRUE));





Y si te decides por el hash, muy útil si los dos archivos están en equipos distintos, aquí puedes encontrar una unit para calcularlo.
http://www.clubdelphi.com/foros/show...22&postcount=4



La franja horaria es GMT +2. Ahora son las 18:16:08.

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