Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Идентично, сэр?   Найти похожие ветки 

 
WhiteGuy   (2005-01-05 18:21) [0]

Здорово, мужики! Уже третий раз за сегодня здороваюсь! 8-)
Как проверить два файла на идентичность?
И, если можно, код! :)


 
Просто Джо ©   (2005-01-05 18:26) [1]

Что есть идентичность, сэр?


 
Просто Джо ©   (2005-01-05 18:28) [2]

Если имя файла, то SysUtils в помощь, функция SameFileName (D6) или AnsiCompareFileName


 
Просто Джо ©   (2005-01-05 18:28) [3]

Но что есть идентичность?


 
Просто Джо ©   (2005-01-05 18:34) [4]

А может нужно содержимое файлов сравнить? Ты скажи, не стесняйся ;)
Может, тогда и про CompareMem напомнят...


 
begin...end ©   (2005-01-05 18:43) [5]

> WhiteGuy   (05.01.05 18:21)

Ну, во-первых, для проверки на НЕидентичность можно использовать контрольную сумму (поиск в Яндексе по буквосочетанию CRC).

Я бы сделал проверку на идентичность (если имеется в виду именно идентичность содержимого файлов) примерно так. Вначале проверил бы на одинаковость размера - если размеры различаются, то, естественно, файлы неодинаковые. Затем считывал бы из каждого файла куски данных и сравнивал бы их побайтно до обнаружения первого несовпадения или до достижения конца файла.

var
 // Имена файлов
 FileName1, FileName2: String;
 // Потоки, с помощью которых можно читать из файлов
 FileStream1, FileStream2: TFileStream;
 // Указатели на буферы, в которых будут очередные куски данных из файлов
 Buffer1, Buffer2: Pointer;
 // Размер каждого буфера
 // Над размером нужно хорошо подумать
 BufferSize: Integer;
 // Количество считанных байт на очередном проходе
 // Вообще-то эти переменные должны быть равны, но так... на всякий случай...
 BytesCount1, BytesCount2: Integer;
 // Переменная, указывающая на идентичность файлов
 Ident: Boolean;
begin
 FileStream1 := TFileStream.Create(FileName1, fmShareDenyNone);
 FileStream2 := TFileStream.Create(FileName2, fmShareDenyNone);
 if FileStream1.Size <> FileStream2.Size then
 begin
   // До свидания, размеры неодинаковые
   FileStream1.Free;
   FileStream2.Free
 end
 else
 begin
   BufferSize := {здесь хорошо думаем};
   // Выделяем память для буферов
   GetMem(Buffer1, BufferSize);
   GetMem(Buffer2, BufferSize);
   try
     repeat
       BytesCount1 := FileStream1.Read(Buffer1^, BufferSize);
       BytesCount2 := FileStream2.Read(Buffer2^, BufferSize);
       if BytesCount1 = BytesCount2 then
         // Непосредственно сравнение кусочков
         Ident := CompareMem(Buffer1, Buffer2, BufferSize);
     until (not Ident) or (BytesCount1 < BufferSize) or (BytesCount2 < BufferSize);
   finally
     // Что бы ни случилось, освобождаем драгоценную память
     FileStream1.Free;
     FileStream2.Free;
     FreeMem(Buffer1, BufferSize);
     FreeMem(Buffer2, BufferSize)
   end
 end
end.


В заключение скажу, что если файлы небольшие, то можно обойтись и без цикла, а разом считывать в буфер весь файл (первый и второй), и потом также сравнивать (CompareMem).

Вместо потоков можно также использовать нетипизированные файлы.


 
GuAV ©   (2005-01-05 19:05) [6]

IMHO, MMF + Comparemem



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.024 c
4-1101719727
Lera
2004-11-29 12:15
2005.01.23
Перехват нажатия кнопки.


10-1081406544
serg128
2004-04-08 10:42
2005.01.23
В чем принципиальная разница между DCOMConnection и SocketConnect


4-1101884061
Dionnis
2004-12-01 09:54
2005.01.23
Определение разделительного знака целой и дробной части числа


1-1105030782
Zaurr
2005-01-06 19:59
2005.01.23
Клонирование


1-1105533833
Lolik
2005-01-12 15:43
2005.01.23
Делаю игру.