Arquivos Binários

Delphi

29/03/2005

Eu já vi alguns tópicos, mas nenhuma fala do que realmente estou tentando fazer...
vou tentar explicar

Preciso fazer uma função que compare 2 arquivos...não importa qual tipo..
pode ser Imagens, Textos, 2 Bancos de Dados..enfim..tudo

Dai o que pensei...vou transformar esses arquivos em binários e comparar...depois q me lembrei isso...veio aquela duvida.. COMO EU FAÇO ESSE TREM????

resumindo..não sei nem por onde começar...

o que eu tenho é isso..

Function AreFilesEqual( Const file1, file2: String ): Boolean;
 Var
   m1, m2: TMemoryStream;
 Begin
   Result := False;
   m1 := TMemoryStream.Create;
   try
     m1.LoadFromFile( file1 );
     m2:= TMemoryStream.Create;
     try
       m2.LoadFromFile( file2 );
       If m1.size = m2.size Then
         Result := CompareMem( m1.Memory, m2.memory, m1.size );
     finally
       m2.free;
     end;
   finally
     m1.free;
   end
 End;



funciona legal, mas como eu carrego os 2 arquivos na memória..quando testei com 2 bancos de 1 giga cada um...dai não rolo..travo tudo...

o q realmete eu quero é...Se alguem souber como eu transformo um arquivo qualquer em um arquivo binários pra eu poder comparar linha a linha (se isso for possível)....

Se alguem puder ajudar, agradeço

[]´s
Alan


Alansvieceli

Alansvieceli

Curtidas 0

Respostas

Beppe

Beppe

29/03/2005

Duas coisas sobre binários:
1) Não tem conceito de linha
2) Eles já são binários no disco, não precisa convertê-los

O negócio é ler aos poucos e ir comparando. Na rotina original eles eram carregados inteiros na memória para então serem comparados.

function ArquivosIguais(const Filename1, Filename2: String): Boolean;
var
  F1, F2: TFileStream;
  B1, B2: array[0..4095] of Byte;
  Lidos: Integer;
begin
  Result := True;
  F1 := TFileStream.Create(Filename1, fmOpenRead or fmShareDenyWrite);
  try
    F2 := TFileStream.Create(Filename2, fmOpenRead or fmShareDenyWrite);
    try
      if F1.Size = F2.Size then
      begin
        repeat
          Lidos := F1.Read(B1, SizeOf(B1));
          F2.ReadBuffer(B2, Lidos);
        until not CompareMem(B1, B2, Lidos) or (Lidos = 0);
        Result := Lidos = 0;
      end else
        Result := False;
    finally
      F2.Free;
    end;
  finally
    F1.Free;
  end;
end;

Nota: fiz sem testar, pf diga se funciona ;)


GOSTEI 0
Alansvieceli

Alansvieceli

29/03/2005

deu erro aqui


until not CompareMem(B1, B2, Lidos) or (Lidos = 0);
erro: incompatible type: ´Array´ and ´Pointer´


GOSTEI 0
Beppe

Beppe

29/03/2005

Ah, saquei! CompareMem exige pointers...

function ArquivosIguais(const Filename1, Filename2: String): Boolean;
var
  F1, F2: TFileStream;
  B1, B2: array[0..4095] of Byte;
  Lidos: Integer;
begin
  Result := True;
  F1 := TFileStream.Create(Filename1, fmOpenRead or fmShareDenyWrite);
  try
    F2 := TFileStream.Create(Filename2, fmOpenRead or fmShareDenyWrite);
    try
      if F1.Size = F2.Size then
      begin
        repeat
          Lidos := F1.Read(B1, SizeOf(B1));
          F2.ReadBuffer(B2, Lidos);
        until not CompareMem(@B1, @B2, Lidos) or (Lidos = 0);
        Result := Lidos = 0;
      end else
        Result := False;
    finally
      F2.Free;
    end;
  finally
    F1.Free;
  end;
end;



GOSTEI 0
POSTAR