Автор | Сообщение |
|
| |
Пост N: 470
Зарегистрирован: 08.07.06
|
|
Отправлено: 06.08.15 16:22. Заголовок: hb_zip / hb_unzip - как проверить целостность архива ?
Добрый день. Неожиданно обнаружил, что один из создаваемых в автоматическом режиме архивов оказался битый. Примерно 40% информации из 120 мегового файла "нормальные", а дальше - тупо CHR(0) До этого момента и после него все идет как нужно, есть подозрение на RDP, которым скачивал файл с удаленного компа на локальный: с инетом были глюки, сессия рвалась несколько раз, каждый раз начинал заново. Копировал Far-ом, может он испортил файл в нештатной ситуации. А может и не он. Чтобы исключить вопрос с Harbour, думаю потратить пару лишних секунд для проверки архива после его создания. Сходу никакой функции для этого дела не обнаружил... Не делать-же Unzip большого архива и сравнивать количество файлов ? Нашел в тестах \contrib\hbmzip\tests пример: hUnzip := hb_unzipOpen( cFileName ) IF ! Empty( hUnzip ) ... ENDIF Подсунул ему свой битый файл, он тихо вернул пустой хэндл. На крайний случай - подойдет, но хотелось-бы что-нить более "правильное". Спасибо.
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 1125
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.08.15 16:27. Заголовок: MD5 не подойдет?..
MD5 не подойдет?
|
|
|
|
| |
Пост N: 471
Зарегистрирован: 08.07.06
|
|
Отправлено: 06.08.15 17:24. Заголовок: PSP пишет: MD5 не п..
PSP пишет: Не очень понимаю, как его можно использовать. Речь ведь НЕ о передаче данных и проверке MD5 в источнике и приемнике, а о только что созданном архиве. Как проверить, что архив "нормальный", если сравнивать MD5 пока не с чем?
|
|
|
|
| постоянный участник
|
Пост N: 1126
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.08.15 17:42. Заголовок: А, пардон. Я понял т..
А, пардон. Я понял так, что проверить надо после передачи.
|
|
|
|
| |
Пост N: 5196
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.15 18:04. Заголовок: Sergy Как вариант с..
Sergy Как вариант создал архив , рядом сложил текстовый файл имяАрхива.md5 , внутрь которого писанул md5 архива. Дальше идея думаю ясна. Не то ?
|
|
|
|
| постоянный участник
|
Пост N: 1127
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.08.15 18:12. Заголовок: Дим, ему нужно после..
Дим, ему нужно после создания архива проверить целостность. Если он уже битый, то md5 будет вычислена с битого архива, что не меняет дела.
|
|
|
|
| |
Пост N: 472
Зарегистрирован: 08.07.06
|
|
Отправлено: 06.08.15 18:39. Заголовок: PSP пишет: нужно по..
PSP пишет: цитата: | нужно после создания архива проверить целостность. Если он уже битый, то md5 будет вычислена с битого архива, что не меняет дела. |
| Да. Именно так.
|
|
|
|
| |
Пост N: 5197
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.15 18:47. Заголовок: Точно )) C толку сби..
Точно )) C толку сбил RDP. А почему бы не создать с помощью hbnetio сервис (RPC) и создавать архив удаленно (не по сети) а затем уже скачивать его чем надо. Вот тогда файлик .md5 и пригодится.
|
|
|
|
| постоянный участник
|
Пост N: 1128
Зарегистрирован: 27.01.07
|
|
Отправлено: 06.08.15 18:53. Заголовок: Вроде есть функция h..
Вроде есть функция hb_zipFileCRC32( cFileName ). Она что на битом и на нормальном возвращает?
|
|
|
|
| |
Пост N: 5198
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.15 21:26. Заголовок: Sergy пишет: Неожид..
Sergy пишет: цитата: | Неожиданно обнаружил, что один из создаваемых в автоматическом режиме архивов оказался битый |
| При удачном создании архива можно создавать файлик .md5 и качать их оба , после слива чекать md5
|
|
|
|
| |
Пост N: 473
Зарегистрирован: 08.07.06
|
|
Отправлено: 07.08.15 00:17. Заголовок: PSP пишет: Вроде ес..
PSP пишет: цитата: | Вроде есть функция hb_zipFileCRC32( cFileName ). Она что на битом и на нормальном возвращает? |
| Только что проверил - два разных длинных целых числа. Dima пишет: цитата: | При удачном создании архива можно создавать файлик .md5 и качать их оба , после слива чекать md5 |
| Файл оказался битый: 1) либо ДО закачки через RDP 2) либо ПОСЛЕ закачки через RDP, но в любом случае битый файл - ИСХОДНЫЙ. Приемный от исходного ничем не отличается. Такие-же 60% в конце - CHR(0).
|
|
|
|
| постоянный участник
|
Пост N: 1129
Зарегистрирован: 27.01.07
|
|
Отправлено: 07.08.15 08:36. Заголовок: Sergy, а вот здесь H..
Sergy, а вот здесь Harbour\source\contrib\hbziparc\ не смотрел? Есть, к примеру, функция hb_GetFilesInZip( cFileName, lVerbose ) Может это подойдет?
|
|
|
|
|
| |
Пост N: 474
Зарегистрирован: 08.07.06
|
|
Отправлено: 07.08.15 23:08. Заголовок: PSP пишет: Sergy, а..
PSP пишет: цитата: | Sergy, а вот здесь Harbour\source\contrib\hbziparc\ не смотрел? Есть, к примеру, функция hb_GetFilesInZip( cFileName, lVerbose ) Может это подойдет? |
| Думаю, да, спасибо. На битом архиве возвращает пустой массив.
|
|
|
|
| постоянный участник
|
Пост N: 1130
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.08.15 09:41. Заголовок: Ну и хорошо )))..
Ну и хорошо )))
|
|
|
|
| |
Пост N: 5201
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.08.15 09:42. Заголовок: PSP пишет: На битом..
Sergy пишет: цитата: | На битом архиве возвращает пустой массив. |
| Битый он может быть по разному. Берем архив и где нить внутри меняем пару-тройку байт , архив битый а массив будет не пустой.
|
|
|
|
| постоянный участник
|
Пост N: 1131
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.08.15 09:45. Заголовок: hb_GetFilesInZip() м..
hb_GetFilesInZip() может вернуть (lVerbose == .T.) массив со всеми подробностями о файлах в архиве, включая crc32 каждого файла. Вобщем, надо экспериментировать. )))
|
|
|
|
| постоянный участник
|
Пост N: 1132
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.08.15 10:13. Заголовок: Сейчас проверил. Дим..
Сейчас проверил. Дима прав. Если испортить несколько байт в уже готовом архиве, это выяснится только на этапе распаковки. hb_GetFilesInZip() этого не замечает. Получается, нужно комбинировать всё это вместе с md5 всего архива.
|
|
|
|
| постоянный участник
|
Пост N: 1133
Зарегистрирован: 27.01.07
|
|
Отправлено: 08.08.15 10:23. Заголовок: И в догонку: как аль..
И в догонку: как альтернатива - внешний архиватор легко проверит архив на целостность.
|
|
|
|
| |
Пост N: 475
Зарегистрирован: 08.07.06
|
|
Отправлено: 08.08.15 16:08. Заголовок: Хотелось-бы без внеш..
Хотелось-бы без внешних "альтернатив"... Тем более, "измененные" пара байт внутри архива всплывут только после распаковки, либо команды "проверить", что по сути будет распаковкой в NUL. Самый правильный способ - распаковать архив в отдельную папку и сравнить crc32 или md5 каждого файла. Для этого достаточно штатных средств. Но это долго и вряд-ли оправдано, пока никем не обнаружен серьезный косяк с созданием собственно архива. hb_ZipFile() использую около года, единичный случай заставил насторожиться и принять меры по доп. проверке. Несколько раз качал архив Фаром через RDP, рвал сессию, проверял исходный файл. Вроде пока норм. Буду проверять дальше.
|
|
|
|
| |
Пост N: 5202
Зарегистрирован: 17.05.05
|
|
Отправлено: 08.08.15 16:19. Заголовок: Sergy пишет: hb_Zip..
Sergy пишет: цитата: | hb_ZipFile() использую около года, единичный случай заставил насторожиться |
| Раз в году и палка стреляет
|
|
|
|
| |
Пост N: 10
Зарегистрирован: 22.09.13
|
|
Отправлено: 26.02.16 12:55. Заголовок: Dima пишет: hb_ZipF..
Dima пишет: цитата: | hb_ZipFile() использую около года, единичный случай заставил насторожиться |
| Да, господа! Увы тоже столкнулся с глюком!!! Всегда для архивации запускал внешние проги RAR или 7-zip, но решил попробовать hb_ZipFile(). Все было хорошо пока размеры архива не превысили 2 Гб. Я обратил внимание при 2,2 Гб (но возможно точка отсчета иная...), что долгое время размер архива не увеличивается, хотя должен расти. Часть файлов просто перестали затаскиваться! Были ли те, которые затащились битыми не проверял... Вставил в прогу вместо hb_ZipFile() архивирование через 7zG.exe - все пошло нормально! Может есть какие соображения? Как-то хочется, по возможности, использовать "все свое"
|
|
|
|
| |
Пост N: 5488
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.02.16 13:43. Заголовок: fokinal21 Тип файло..
fokinal21 Тип файловой системы какой ?
|
|
|
|
|
| |
Пост N: 11
Зарегистрирован: 22.09.13
|
|
Отправлено: 29.02.16 11:55. Заголовок: NTFS Про ОС: Должно..
NTFS Про ОС: Должно работать на WIN server 2008, проверил и на win 7 (64) тот же эффект
|
|
|
|
| Администратор
|
Пост N: 3406
Зарегистрирован: 23.05.05
|
|
Отправлено: 29.02.16 12:21. Заголовок: Даже не надо смотрет..
Даже не надо смотреть сырцы hb_zip, чтобы определить причину: где-то используются 32-битные ulong вместо 64-битных. Попробуйте взять 64-битный харбор, ну и соответственно собрать программы с ним, Возможно, проблема исчезнет.
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 22.09.13
|
|
Отправлено: 29.02.16 18:00. Заголовок: Да, собрал, все пошл..
Да, собрал, все пошло... Только в этом варианте, файлы с русскими названиями, в архив попадают в виде крякозябров! Может ткнете сразу где залатать?
|
|
|
|
| |
Пост N: 819
Зарегистрирован: 20.02.11
|
|
Отправлено: 29.02.16 18:44. Заголовок: fokinal21 пишет: То..
fokinal21 пишет: цитата: | Только в этом варианте, файлы с русскими названиями, в архив попадают в виде крякозябров! Может ткнете сразу где залатать? |
| добавить в программу поддержку CP866 и передавать имена в OEM , т.к. ZIP исторически работает в OEM кодировке
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 22.09.13
|
|
Отправлено: 01.03.16 10:33. Заголовок: спасибо, все пошло! ..
спасибо, все пошло!
|
|
|
|
| постоянный участник
|
Пост N: 4757
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.16 17:00. Заголовок: Что-то мне непонятно..
Что-то мне непонятно, как это сделать. Имею такой код: COMPRESS aFiles ; TO cBackupZip ; BLOCK { | cFile, nPos | ProgressUpdate( nPos, cFile, aSizeFiles, .T. ) } ; LEVEL LEVEL_ZIP ; OVERWRITE ; STOREPATH ; FILEPROGRESS { | nPos, nTotal | ProgressFile( nPos, nTotal, .T. ) } ; RESULT lSuccess И где здесь ставить перекодировку ? Или можно сразу перекодировать aFiles, а функция сама возьмёт файлы в OEM кодировке ? P.S. попробовал перекодировать массив - архив перестал собираться. Видать нужно другую функцию использовать.
|
|
|
|
| |
Пост N: 5499
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.03.16 17:29. Заголовок: Andrey пишет: Или м..
Andrey пишет: цитата: | Или можно сразу перекодировать aFiles, а функция сама возьмёт файлы в OEM кодировке ? |
| за это время пока ты писал пост , мог бы 100 раз уже проверить своё предположение
|
|
|
|
| постоянный участник
|
Пост N: 4758
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.03.16 17:45. Заголовок: Да пока другую работ..
Да пока другую работу писал... Нашёл куда вставить. Скрытый текст *------------------------------------------------------------------------------* PROCEDURE COMPRESSFILES ( cFileName , aDir , bBlock , lOvr , lStorePath , cPassword ) *------------------------------------------------------------------------------* LOCAL hZip , cZipFile , i if valtype (lOvr) == 'L' if lOvr == .t. if file (cFileName) delete file (cFileName) endif endif endif hZip := HB_ZIPOPEN( cFileName ) IF ! EMPTY( hZip ) FOR i := 1 To Len (aDir) if valtype (bBlock) == 'B' Eval ( bBlock , aDir , i ) endif cZipFile := iif( lStorePath, aDir , cFileNoPath( aDir ) ) cZipFile := HB_ANSITOOEM( cZipFile ) HB_ZipStoreFile( hZip, aDir , cZipFile, cPassword ) NEXT ENDIF HB_ZIPCLOSE( hZip ) RETURN
|
|
|
|
|
| |
Пост N: 820
Зарегистрирован: 20.02.11
|
|
Отправлено: 01.03.16 18:08. Заголовок: Dima пишет: Нашёл к..
Andrey пишет: поздравляю
|
|
|
|
| |
Пост N: 5911
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.07.16 14:11. Заголовок: Sergy пишет: Неожид..
Sergy пишет: цитата: | Неожиданно обнаружил, что один из создаваемых в автоматическом режиме архивов оказался битый. |
| Как решил вопрос ?
|
|
|
|
|
| |
Пост N: 5914
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.07.16 14:17. Заголовок: ZIP наливается на ФТ..
ZIP наливается на ФТП а в это время другая программа обнаруживает этот ZIP и пытается его распаковать но получает ошибку так как файл еще не дозалит. Не пойму как ловить в этом случае битый не битый архив. Наливаю ZIP на ФТП не я (не моя прога) , наливает планшет. У себя например делаю так , наливаю архив но с расширением TST к примеру и если заливка удачна переименовываю расширение на ZIP
|
|
|
|
| постоянный участник
|
Пост N: 1243
Зарегистрирован: 27.01.07
|
|
Отправлено: 23.07.16 14:24. Заголовок: Dima пишет: Не пойм..
Dima пишет: цитата: | Не пойму как ловить в этом случае битый не битый архив. |
| Если ошибка, вычисляешь контрольную сумму файла. Потом делаешь повторное чтение через некоторое время. Опять вычисляешь контрольную сумму. Сравниваешь их. Если разные, значит файл изменился и пробуешь распаковать. Если одинаковые, - значит битый.
|
|
|
|
| |
Пост N: 5915
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.07.16 14:40. Заголовок: PSP :sm36: ..
PSP
|
|
|
|
| |
Пост N: 495
Зарегистрирован: 08.07.06
|
|
Отправлено: 25.07.16 00:45. Заголовок: Dima пишет: Как реш..
Dima пишет: Сразу после создания архива - с помощью hb_GetFilesInZip() проверяю список файлов в нем. Должен совпадать со списком переданных. Далее беру его CRC32 и начинаю копирование. После копирования - сравниваю CRC32 копии. По времени задержка небольшая, бэкап делается в два места: на локальный диск и на файловый сервер.
|
|
|
Ответов - 35
, стр:
1
2
All
[только новые]
|
|