Счетчик HotLog

На главнуюЧто я делаю...Программы автора и не только...Творчество
Статьи автораКнига отзывов и предложенийОбо мне, любимомФотоальбом

 
 

Как сравнить два файла

Иногда возникает необходимость сравнения файлов, причем сравнение по размеру необходимо, но недостаточно. В таком случае остается лишь побайтовое сравнение файлов.

uses
  Classes, Windows;

function AreFilesEqual(const FileName1, FileName2: String): Boolean;
const
  BUFFER_SIZE = 4096;
var
  FileStream1, FileStream2: TFileStream;
  Buffer1, Buffer2: AnsiString;
  BufferSize, BufferReadSize1, BufferReadSize2: Integer;
begin
  try
    FileStream1 := TFileStream.Create(FileName1, fmOpenRead);
    try
      FileStream2 := TFileStream.Create(FileName2, fmOpenRead);
      Result := FileStream1.Size = FileStream2.Size;
      if Result then
      try
        SetLength(Buffer1, BUFFER_SIZE);
        SetLength(Buffer2, BUFFER_SIZE);
        BufferSize := BUFFER_SIZE * SizeOf(AnsiChar);
        ZeroMemory(PAnsiChar(Buffer1), BufferSize);
        ZeroMemory(PAnsiChar(Buffer2), BufferSize);
        repeat
          BufferReadSize1 := FileStream1.Read(Buffer1[1], BufferSize);
          BufferReadSize2 := FileStream2.Read(Buffer2[1], BufferSize);
          Result := Result and (BufferReadSize1 = BufferReadSize2) and (Buffer1 = Buffer2);
        until not Result or (BufferReadSize1 <> BufferSize);
      finally
        FileStream2.Free;
      end;
    finally
      FileStream1.Free;
    end;
  except
    Result := False;
  end;
end;

Для сравнительно небольших файлов можно использовать другой способ. Его основное отличие состоит в том, что файлы целиком считываются в память. Так как это осуществляется за одно обращение к файловой системе, метод работает значительно быстрее, но только на небольших файлах. На больших файлах он начинает отставать по быстродействию, а на очень больших он просто рухнет. Но тут уже вам выбирать, какой способ подходит больше.

uses
 Classes, Windows;

function CompareFiles(const FileName1, FileName2: String): Boolean;
var
  File1Content, File2Content: TMemoryStream;
  File1Size, File2Size: Cardinal;
  File1Handle, File2Handle: THandle;
begin
  Result := False;
  File1Handle := CreateFile(PAnsiChar(FileName1), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
  try
    File2Handle := CreateFile(PAnsiChar(FileName2), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
    try
      if (File1Handle <> INVALID_HANDLE_VALUE) and (File2Handle <> INVALID_HANDLE_VALUE) then
      begin
        Result := GetFileSize(File1Size, nil) = GetFileSize(File2Size, nil);
        if Result then
        begin
          File1Content := TMemoryStream.Create;
          try
            File2Content := TMemoryStream.Create;
            try
              File1Content.LoadFromFile(FileName1);
              File2Content.LoadFromFile(FileName2);
              Result := CompareMem(File1Content.Memory, File2Content.Memory, File1Content.Size);
            finally
              File2Content.Free;
            end;
          finally
            File1Content.Free;
          end;
        end;
      end;
    finally
      CloseHandle(File2Handle);
    end;
  finally
    CloseHandle(File1Handle);
  end;
end;

Смотрите также:

 
 

08.12.2006

 
     
Hosted by uCoz