Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.05 c
1-1104992538
lightix
2005-01-06 09:22
2005.01.23
C++ Builder и Pascal


1-1104743119
TeNY
2005-01-03 12:05
2005.01.23
Полезная програ для работы в Delhpi Easy Bufer v1.01


14-1104328422
PVOzerski
2004-12-29 16:53
2005.01.23
Может, и нашего сайта дизайн и "движок" оцените?


14-1104780262
Zacho
2005-01-03 22:24
2005.01.23
Мистика, ужасы и т.п.


1-1105089078
Dr. Genius
2005-01-07 12:11
2005.01.23
Контекстное меню папок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский