Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проверить эквивалентность двух файлов

Delphi , Файловая система , Файлы

Проверить эквивалентность двух файлов


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

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  if Opendialog1.Execute then 
    if Opendialog2.Execute then 
      if 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); 
    try       
      if fs1.Size = fs2.Size then  
      begin         
        while fs1.Position < fs1.Size do  
        begin           
          L1 := fs1.Read(B1[1], BlockSize); 
          L2 := fs2.Read(B2[1], BlockSize); 
          if L1 <> L2 then  
          begin             
            Exit; 
          end;           
          if not 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Файлы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-10-24 19:54:02/0.0035438537597656/0