function CompareFiles(Filename1,FileName2:string):longint;
{
возвращает номер несовпадающего байта,
(байты отсчитываются с 1)или:
0 - не найдено отличий,
-1 - ошибка файла 1
-2 - ошибка файла 2
-3 - другие ошибки
}const
Buf_Size=16384;
var
F1,F2:TFileStream;
i:longint;
Buff1,Buff2:PByteArray;
BytesRead1,BytesRead2:integer;
begin
Result:=0;
try
F1:=TFileStream.Create(FileName1,fmShareDenyNone);
except
Result:=-1;
exit;
end;
try
F2:=TFileStream.Create(FileName2,fmShareDenyNone);
except
Result:=-2;
F1.Free;
exit;
end;
GetMem(Buff1,Buf_Size);
GetMem(Buff2,Buf_Size);
tryif F1.Size> F2.Size then Result:=F2.Size+1
elseif F1.SizeF1.Position) and (Result=0) dobegin
BytesRead1 :=F1.Read(Buff1^,Buf_Size);
BytesRead2 :=F2.Read(Buff2^,Buf_Size);
if (BytesRead1=BytesRead2) thenbeginfor i:= 0 to BytesRead1-1 dobeginif Buff1^[i]< > Buff2^[i]
thenbegin
result:=F1.Position-BytesRead1+i+1;
break;
end;
end;
endelsebegin
Result:=-3;
break;
end;
end;
end;
except
Result:=-3;
end;
F1.Free;
F2.Free;
FreeMem(Buff1,Buf_Size);
FreeMem(Buff2,Buf_Size);
end;
Перевод контента на русский язык:
Функция CompareFiles - это функция Delphi, которая сравнивает два файла для обнаружения отличий. Функция принимает два параметра типа string - Filename1 и FileName2, которые являются именами файлов для сравнения.
Рассмотрим, как работает функция:
Сначала она пытается создать объекты TFileStream для обоих файлов с помощью метода Create. Если какой-либо файл не может быть открыт, возвращается ошибка (-1 или -2).
Функция затем выделяет два массива байтов (Buff1 и Buff2) размером 16 384 байта (определено константой Buf_Size).
Она вступает в цикл, где читает блоки данных из обоих файлов в соответствующие массивы байтов с помощью метода Read.
Если количество прочитанных байт для каждого файла не равно, возвращается ошибка (-3).
Функция затем сравнивает содержимое двух массивов байтов по байтам. Если она находит несоответствие, возвращает позицию этого несоответствия (начиная с 1) и выходит из цикла.
Если не находим несоответствий после чтения всех блоков данных, функция возвращает 0, чтобы указать, что файлы идентичны.
В предложенном альтернативном решении:
functionCompareFiles(FileName1,FileName2:string):LongInt;constBufSize=16384;varF1,F2:TFileStream;i:LongInt;Buff1,Buff2:PByteArray;beginResult:=0;tryF1:=TFileStream.Create(FileName1,fmShareDenyNone);F2:=TFileStream.Create(FileName2,fmShareDenyNone);exceptonE:ExceptiondoResult:=-3;// Другая ошибкаexit;end;ifF1.Size<>F2.SizethenResult:=(F1.Size>F2.Size)?F2.Size+1:F1.Size;GetMem(Buff1,BufSize);GetMem(Buff2,BufSize);trywhileF1.Position<F1.SizedobeginF1.Read(Buffer(Buff1^,BufSize));F2.Read(Buffer(Buff2^,BufSize));fori:=0toBufSize-1doifBuff1^[i]<>Buff2^[i]thenbeginResult:=F1.Position+i+1;break;end;end;finallyFreeMem(Buff1,BufSize);FreeMem(Buff2,BufSize);F1.Free;F2.Free;end;end;
Альтернативное решение более robust и лучше обрабатывает ошибки. Оно также использует свойство Buffer объекта TFileStream для чтения данных, что является безопаснее способом чтения файлов в Delphi.
Функция CompareFiles сравнивает два файла и возвращает номер несовпадающего байта или код ошибки.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.