Главная страница
    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.046 c
1-1104777225
starling13
2005-01-03 21:33
2005.01.23
Сортировка в ListView


1-1105146030
Conduct
2005-01-08 04:00
2005.01.23
Если мы создаём несколько TStringList ов, то надо делать один


1-1104831765
studentas
2005-01-04 12:42
2005.01.23
Как вызвать ShowModal дочерней форме?


3-1103520719
EvgeniyR
2004-12-20 08:31
2005.01.23
Использование DBChart


1-1105010379
TeNY
2005-01-06 14:19
2005.01.23
Сформировать и отправить запрос на HTTP server





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский