Заметки · 19.07.2024

Семь раз сравни, один раз…

В продолжении наболевшей темы контрольных сумм (тег) и кирпичиков для IDE Lazarus.

В одном из рабочих проектов возникла необходимость в зеркалировании достаточно увесистых файлов, основываясь на их контрольной сумме. Получилась функция CopyFileHashBased:

uses ..., md5, FileUtil, ...;

function CopyFileHashBased(source: string; destination: string):boolean;
var
  sourcehash: string;
  destinationhash: string;
begin
  if FileExists(destination) then
  begin
    sourcehash:=MD5Print(MD5File(source));
    destinationhash:=MD5Print(MD5File(destination));
    if sourcehash<>destinationhash then
      if CopyFile(source, destination)=True
      then result:=true
      else result:=false
    else
      result:=false;
  end
  else
      if CopyFile(source, destination)=True
      then result:=true
      else result:=false;
end;

Весь функционал основан на стандартной логической функции CopyFile из состава модуля FileUtil и MD5File из модуля md5.

Функция CopyFileHashBased принимает два параметра: файл-источник и файл-приёмник. Сначала проверяется наличие файла-приёмника. Если файла нет в указанном месте, то он копируется.

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

Разумеется, если файлы идентичны — функция ничего не делает и возвращает False. Если файл был скопирован — возвращается True.

Пример с выводом информационного окна:

ShowMessage(BoolToStr(CopyFileHashBased('1.file', '2.file'),True));