function Are2FilesEqual(const File1, File2: TFileName): Boolean;
var
ms1, ms2: TMemoryStream;
begin
Result := False;
ms1 := TMemoryStream.Create;
try
ms1.LoadFromFile(File1);
ms2 := TMemoryStream.Create;
try
ms2.LoadFromFile(File2);
if ms1.Size = ms2.Size then
Result := CompareMem(ms1.Memory, ms2.memory, ms1.Size);
finally
ms2.Free;
end;
finally
ms1.Free;
endend;
procedure TForm1.Button1Click(Sender: TObject);
beginif Opendialog1.Execute thenif Opendialog2.Execute thenif Are2FilesEqual(Opendialog1.FileName, Opendialog2.FileName) then
ShowMessage('Files are equal.');
end;
{********************************************}{2.}function FilesAreEqual(const File1, File2: TFileName): Boolean;
const
BlockSize = 65536;
var
fs1, fs2: TFileStream;
L1, L2: Integer;
B1, B2: array[1..BlockSize] of Byte;
begin
Result := False;
fs1 := TFileStream.Create(File1, fmOpenRead or fmShareDenyWrite);
try
fs2 := TFileStream.Create(File2, fmOpenRead or fmShareDenyWrite);
tryif fs1.Size = fs2.Size thenbeginwhile fs1.Position < fs1.Size dobegin
L1 := fs1.Read(B1[1], BlockSize);
L2 := fs2.Read(B2[1], BlockSize);
if L1 <> L2 thenbegin
Exit;
end;
ifnot CompareMem(@B1[1], @B2[1], L1) then Exit;
end;
Result := True;
end;
finally
fs2.Free;
end;
finally
fs1.Free;
end;
end;
Первый вариант функции Are2FilesEqual использует TMemoryStream для загрузки содержимого обоих файлов в память и затем сравнивает их с помощью CompareMem. Если размеры потоков равны, то функция проверяет идентичность содержимого, сравнивая блоки памяти.
Второй вариант функции FilesAreEqual использует TFileStream для чтения файлов по блокам и сравнивает каждый блок с помощью CompareMem. Если обнаружен какой-либо несоответствие, то функция выходит из цикла и устанавливает результат в false. Если все блоки совпадают, то функция устанавливает результат в true.
Сравнение
Первый вариант использует память для загрузки содержимого файла целиком и затем сравнивает его. Это может быть неэффективно для больших файлов, так как требует загрузки всего файла в память одновременно.
Второй вариант читает файлы по блокам и сравнивает каждый блок индивидуально. Это более эффективно для больших файлов, так как только загружается маленькая часть файла в память одновременно.
В целом, второй вариант (FilesAreEqual) является лучше реализацией, потому что он более эффективен и масштабируется для больших файлов. Однако, если вам нужно сравнить очень маленькие файлы или у вас есть конкретные требования, которые предпочитают первый подход, вы можете использовать Are2FilesEqual.
В статье рассматриваются два алгоритма для проверки эквивалентности двух файлов на языке Delphi, использующие различные подходы к сравнению содержимого файлов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.