|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
05.10.2012, 08:03 | #1 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
Контроль изменения файлов
Здравствуйте, уважаемые.
Есть сторонняя программа, состоящая из большого количества файлов, причем файлы по большей части имеют приличный размер (суммарно порядка 15Гб). Нужно организовать программу-обновлятор, которая будет грузить список файлов с сервера, дальше каким-либо образом сравнивать файл из списка с серверным, и, если есть изменения, то загружать его. Столкнулся с проблемой сравнения файлов. Если высчитывать MD5 содержимого файла - получается оочень долго, в 4 потоках составляет лист около 5 минут. Про CRC32 читал, что контрольные суммы одного и того же файла могут различаться на разных файловых системах при разном локальном времени компьютера. Подскажите, какой лучше взять алгоритм, чтобы безошибочно определить изменение хотя бы одного байта, но при этом который будет работать относительно быстро?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} |
05.10.2012, 08:25 | #2 | ||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
Цитата:
а что, размер файла и дата его последней модификации файла Вас не устраивает? Хотя бы как основание для более детальной проверки (расчёт и сравнение контрольной суммы)?! А ещё, если Ваши файлы имеют определённую структуру, например, заголовок, контрольную сумму внутри файла и т.п. - то можно проверять именно эти области... |
||
05.10.2012, 08:33 | #3 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
Спасибо, Сергей.
Попробую положиться на CRC32, всё же это быстрее мд5. Про размер файлов и дату модификации - да, не додумался, попробую. В файлах нет заголовков или другой отличительной информации, более того, они зашифрованы. И суть апдейтера в том, что пользователю хватит ума изменить его содержимое, декрипторы в сети есть. И ещё вопрос. Из WinAPI нет ни чего подобного для вычисления некоей контрольной суммы?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} |
05.10.2012, 08:46 | #4 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
CheckSumMappedFile
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
05.10.2012, 08:57 | #5 | |||
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
НО! CRC32 + имя_файла + его_размер - дадут вам практическую гарантию/защиту от подобных коллизий! Цитата:
Вы знаете антивирус Касперского? там, например, есть XML файлы в составе баз сигнатур. в конце там присутствует такой текст: Цитата:
Чтобы ни один байт в файле не был изменён без ведома Хозяина. Это я к чему рассказываю.. Добавьте в конце каждого своего файла контрольную сумму. (если файл зашифрован - то наличие контрольной суммы - это ещё одна проверка целостности файла). Считывайте эту сумму из файла и сверяйте с той, что на сервере. Скорость будет более чем достаточной ! |
|||
05.10.2012, 09:13 | #6 |
кривокодер ;)
Форумчанин
Регистрация: 20.06.2008
Сообщений: 707
|
Файлы не мои, как я уже писал.
И дописывать к ним ни чего нельзя. Спасибо за советы, вечером буду пробовать.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид} |
05.10.2012, 09:32 | #7 | |
Старожил
Регистрация: 09.01.2008
Сообщений: 26,229
|
Цитата:
ещё один вариант решения (просто придуманный трюк для ускорения) создаём в нужном (или любом доступном рабочем каталоге, например %AppData%) каталоге файлик (формат тоже не важен. я бы использовал какую-нибудь простенькую БД, но и обычный XML подойдёт). Такой файлик (если есть доступ, конечно) может быть размещен и на сервере. в данном файле следующая информация: Код:
для каждого файла в цикле находим соответствующий ему файл в локальной папке. Если нашли, то по имени находим Конт.Данные (КД) и сравниваем с фактическими (которые имеются у реального файла). Разумеется, полную MD5 на этом этапе не проверяем! Если размер+дата_модификации+CRC32_heade r_footer из БД совпали с фактическими - то этот файл считаем актуальным, дальнейшую обработку его не производим. Если любой из параметров отличается - идём на контроль ПОЛНОЙ MD5: считываем MD5 с сервера, считаем локальную MD5 - если MD5 не совпадают - скачиваем новую версию файла. В любом случае после обновляем КД в нашей локальной БД. Очевидно, если для какого-то файла нет данных в нашей локальной БД (или БД вообще пустая), то выполняем полный расчёт MD5 и сохранение всех КД в нашей локальной БД. Разумеется, при первом запуске программа будет "пыхтеть" достаточно долго (минут 5, согласно вашему утверждению). Зато потом контроль можно осуществлять за секунды... Примерно так... p.s. а ещё, в NTFS есть такая фишка, как дополнительные файловые потоки. Тот же Касперский ими пользуется. Можно сохранять контрольную сумму файла в доп.поток. Последний раз редактировалось Serge_Bliznykov; 05.10.2012 в 09:39. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Контроль файлов | VadEr | Помощь студентам | 0 | 15.02.2011 14:56 |
Мониторинг изменения файлов | Сергей846 | Общие вопросы Delphi | 2 | 20.08.2010 08:07 |
Разрешить изменения файлов по сети | joojle | Операционные системы общие вопросы | 3 | 09.07.2009 12:39 |
Программа получения списка файлов директории и изменения атрибутов файлов | roma86 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 7 | 09.06.2009 09:08 |
Контроль скачивания файлов | kormax | PHP | 4 | 02.10.2008 15:39 |