Сравнение файлов

Vadik(R)

Well-known member
12.12.2007
469
0
#1
Люди, как узнать идентичны ли два файла или нет? Я имею в виду само содержание файлов, а не дату создания или другие атрибуты. Вот, например, я долго качал файл размером 178Мб с одного сайта. И скачал этот же файл из локалки намного быстрее. Я хочу узнать, одинаковы ли эти два файла или разные. Может не смысла качать из внешки если одинаковые. Вот составил такой код: [codebox]program compare;
uses
SysUtils;

{$APPTYPE CONSOLE}

var i : longint;
f1,f2 : file of char;
c,d : char;
begin
assign(f1,'C:\file1.avi');
reset(f1);
assign(f2,'C:\file2.avi');
reset(f2);
while not eof(f1) do
begin
i:=i+1;
read(f1,c);
read(f2,d);
if c<>d then
begin
writeln(ошибка в байте: ',i,'.');
readln;
halt
end
end;
if (filesize(f1)<>filesize(f2)) or (NOT (eof(f1))) or (NOT (eof(f2))) then
begin
writeln('ошибка в размерах фалов.');
readln;
halt
end;
close(f1);
close(f2);
write('файлы идентичны.')
readln;
end.[/codebox]
Но это тупое сравнение, по-моему оно длилось около 1.5 часа! Ясно дело есть быстрее, так как если копировать файл размером 100 Мб из одной папки в другую, то это занимает секунды. Пожалуйста скажите как написать программу сравнивающую два файла быстрее. Или функцию, если такая есть!
 
Y

Yason

#2
Если просто сравнить два файла - можно использовать Total Commander: Files - Compare by content.
Если хочется сделать свою программу - вот пара советов по улучшению быстродействия.
1. Считывать из файла лучше не один байт, а сразу много, где-нибудь порядка нескольких килобайт (например, 4кб). Для винчестера что первое, что второе - один оборот.
2. Сравнивать тоже лучше не побайтово, а массивами, например при помощи APIшной функции strncmp.
3. Размеры файлов логичнее сравнивать в самом начале, т.к. если они разные -- файлы тоже разные, и дальше можно не проверять.
 

Vadik(R)

Well-known member
12.12.2007
469
0
#3
Спасибо!

P.S. 5 спасибо = 1 плюс. Жди ещё 4 спасиба от меня :lol: