Asunto: Comparar dos ficheros bit a bit con Delphi
Necesito realizar un procedimiento en delphi que compare dos ficheros bit a bit, no me sirve por fecha de modificación y tamaño, necesito comparar cada bit de un fichero con el otro para garantizar que sean idénticos.
Utilizo Delphi como lenguaje de programación.
Publicado:
Sab Ago 08, 2009 7:23 pm
alonsojpd Administrador/Moderador
Registrado: Sep 16, 2003 Mensajes: 2687
Asunto: Re: Comparar dos ficheros bit a bit con Delphi
Anuncios
varios escribió:
Necesito realizar un procedimiento en delphi que compare dos ficheros bit a bit, no me sirve por fecha de modificación y tamaño, necesito comparar cada bit de un fichero con el otro para garantizar que sean idénticos.
Utilizo Delphi como lenguaje de programación.
Puedes utilizar este código de nuestra aplicación AjpdSoft Comparar Ficheros bit a bit:
//función que compara bit a bit posiciones de memoria
function compararMemoria (P1, P2: Pointer; Length: Integer) : Boolean; assembler;
asm
PUSH ESI
PUSH EDI
MOV ESI,P1
MOV EDI,P2
MOV EDX,ECX
XOR EAX,EAX
AND EDX,3
SHR ECX,2
REPE CMPSD
JNE @@2
MOV ECX,EDX
REPE CMPSB
JNE @@2
@@1: INC EAX
@@2: POP EDI
POP ESI
end;
//Función que compara dos ficheros bit a bit
//si son iguales devolverá TRUE
function compararFicheros (fichero1 : string; fichero2 : string;
var tamanoIgual : boolean; var contenidoIgual : boolean) : boolean;
var
fichero1Memoria : TMemoryStream;
fichero2Memoria : TMemoryStream;
begin
Result := false;
//Creamos las dos MemoryStream
fichero1Memoria := TMemoryStream.Create;
fichero2Memoria := TMemoryStream.Create;
try
//Cargamos en las dos MemoryStream los dos ficheros
fichero1Memoria.LoadFromFile(fichero1);
fichero2Memoria.LoadFromFile(fichero2);
//comparamos el tamaño de los ficheros
if fichero1Memoria.Size = fichero2Memoria.Size then
tamanoIgual := true
else
tamanoIgual := false;
//comparamos el contenido de los ficheros (bit a bit)
contenidoIgual := compararMemoria (fichero1Memoria.Memory,
fichero2Memoria.Memory, fichero1Memoria.Size);
if tamanoIgual and contenidoIgual then
Result := true
else
Result := false;
procedure TformMenuPrincipal.bCompararClick(Sender: TObject);
var
resultadoComparacion : boolean;
tamanoIgual, contenidoIgual : Boolean;
begin
lResultado.Caption := '';
lResultado.Color := clBtnFace;
be.Panels[1].Text := '';
if txtFichero1.Text = txtFichero2.Text then
MessageDlg('Ha seleccionado como Fichero 1 y Fichero 2 el mismo.',
mtInformation, [mbok], 0)
else
begin
if not FileExists(txtFichero1.Text) or not FileExists(txtFichero2.Text) then
MessageDlg('Uno de los dos ficheros seleccionados no existe.',
mtInformation, [mbok], 0)
else
begin
be.Panels[1].Text := 'Comparando...';
Screen.Cursor := crHourGlass;
resultadoComparacion := compararFicheros (txtFichero1.Text,
txtFichero2.Text, tamanoIgual, contenidoIgual);
Screen.Cursor := crDefault;
opTamanoIgual.Checked := tamanoIgual;
opContenidoIgual.Checked := contenidoIgual;
if resultadoComparacion then
begin
be.Panels[1].Text := 'Los ficheros son IGUALES';
lResultado.Caption := 'Los ficheros son IGUALES';
lResultado.Color := clGreen;
end
else
begin
be.Panels[1].Text := 'Los ficheros son DIFERENTES';
lResultado.Caption := 'Los ficheros son DIFERENTES';
lResultado.Color := clRed;
end;
end;
end;
end;
procedure TformMenuPrincipal.bFichero1Click(Sender: TObject);
begin
if dlAbrir.Execute then
txtFichero1.Text := dlAbrir.FileName;
end;
procedure TformMenuPrincipal.bFichero2Click(Sender: TObject);
begin
if dlAbrir.Execute then
txtFichero2.Text := dlAbrir.FileName;
end;
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A