Fórum Arquivos Binários #274359
29/03/2005
0
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
Curtir tópico
+ 0Posts
29/03/2005
Beppe
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
29/03/2005
Alansvieceli
until not CompareMem(B1, B2, Lidos) or (Lidos = 0);
erro: incompatible type: ´Array´ and ´Pointer´
Gostei + 0
29/03/2005
Beppe
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
Clique aqui para fazer login e interagir na Comunidade :)