В продолжении наболевшей темы контрольных сумм (тег) и кирпичиков для 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));