Главная страница
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.025 c
14-1104443459
olookin
2004-12-31 00:50
2005.01.23
Томительно легко... откуда строчки?


4-1101482473
alsov1
2004-11-26 18:21
2005.01.23
Можно ли достать текст из StringGrid а зная его hWnd


3-1103520417
Рафик
2004-12-20 08:26
2005.01.23
Компонента с помощью котрой можно не использовать BDE


14-1104590246
vopros
2005-01-01 17:37
2005.01.23
Уберите их с экрана пожайлуста


1-1105226563
reaper
2005-01-09 02:22
2005.01.23
WebBrowser и ShellListView в одном окне