Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki
Proyecto AjpdSoft: Foros

AjpdSoft :: Ver tema - Comparar dos ficheros bit a bit con Delphi
Foros de discusión Buscar Perfil FAQ Iniciar sesión
Information Comparar dos ficheros bit a bit con Delphi

Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net   
Ver tema anterior :: Ver tema siguiente
AutorMensaje
varios
Magnífico usuario


Registrado: Oct 10, 2006
Mensajes: 2092

Asunto: Comparar dos ficheros bit a bit con Delphi Responder citando

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.
MensajePublicado:
Sab Ago 08, 2009 7:23 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Comparar dos ficheros bit a bit con Delphi Responder citando



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:

Código:

unit UnidadMenuPrincipal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, shellapi;

type
  TformMenuPrincipal = class(TForm)
    GroupBox1: TGroupBox;
    Label1: TLabel;
    txtFichero1: TEdit;
    bFichero1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    txtFichero2: TEdit;
    bFichero2: TButton;
    bComparar: TButton;
    dlAbrir: TOpenDialog;
    be: TStatusBar;
    LWEB: TLabel;
    GroupBox2: TGroupBox;
    lResultado: TStaticText;
    opTamanoIgual: TCheckBox;
    opContenidoIgual: TCheckBox;
    procedure bCompararClick(Sender: TObject);
    procedure bFichero1Click(Sender: TObject);
    procedure bFichero2Click(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  formMenuPrincipal: TformMenuPrincipal;

implementation

{$R *.dfm}

//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;

  finally
    Screen.Cursor := crDefault;
    fichero1Memoria.Free;
    fichero2Memoria.Free;
    fichero1Memoria := Nil;
    fichero2Memoria := Nil;
  end;
end;

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;

procedure TformMenuPrincipal.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com'),
      Nil, Nil, SW_SHOWNORMAL);
end;

end.

MensajePublicado:
Sab Ago 08, 2009 7:34 pm
Top of PageVer perfil de usuario
alonsojpd
Administrador/Moderador


Registrado: Sep 16, 2003
Mensajes: 2687

Asunto: Re: Comparar dos ficheros bit a bit con Delphi Responder citando



Anuncios



Aquí tienes una aplicación que te servirá como ejemplo: AjpdSoft Comparar Ficheros bit a bit:

http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=412
MensajePublicado:
Dom Ago 09, 2009 7:09 pm
Top of PageVer perfil de usuario
Mostrar mensajes de anteriores:   
Todas las horas son GMT - 1 Horas
Publicar nuevo tema Responder al tema
Foros de discusión » Borland Delphi, Codegear Delphi .Net  

Cambiar a:  
Key
  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