Форум » [x]Harbour » hb_zip / hb_unzip - как проверить целостность архива ? » Ответить

hb_zip / hb_unzip - как проверить целостность архива ?

Sergy: Добрый день. Неожиданно обнаружил, что один из создаваемых в автоматическом режиме архивов оказался битый. Примерно 40% информации из 120 мегового файла "нормальные", а дальше - тупо CHR(0) До этого момента и после него все идет как нужно, есть подозрение на RDP, которым скачивал файл с удаленного компа на локальный: с инетом были глюки, сессия рвалась несколько раз, каждый раз начинал заново. Копировал Far-ом, может он испортил файл в нештатной ситуации. А может и не он. Чтобы исключить вопрос с Harbour, думаю потратить пару лишних секунд для проверки архива после его создания. Сходу никакой функции для этого дела не обнаружил... Не делать-же Unzip большого архива и сравнивать количество файлов ? Нашел в тестах \contrib\hbmzip\tests пример: hUnzip := hb_unzipOpen( cFileName ) IF ! Empty( hUnzip ) ... ENDIF Подсунул ему свой битый файл, он тихо вернул пустой хэндл. На крайний случай - подойдет, но хотелось-бы что-нить более "правильное". Спасибо.

Ответов - 35, стр: 1 2 All

Dima: fokinal21 Тип файловой системы какой ?

fokinal21: NTFS Про ОС: Должно работать на WIN server 2008, проверил и на win 7 (64) тот же эффект

Pasha: Даже не надо смотреть сырцы hb_zip, чтобы определить причину: где-то используются 32-битные ulong вместо 64-битных. Попробуйте взять 64-битный харбор, ну и соответственно собрать программы с ним, Возможно, проблема исчезнет.


fokinal21: Да, собрал, все пошло... Только в этом варианте, файлы с русскими названиями, в архив попадают в виде крякозябров! Может ткнете сразу где залатать?

Haz: fokinal21 пишет: Только в этом варианте, файлы с русскими названиями, в архив попадают в виде крякозябров! Может ткнете сразу где залатать? добавить в программу поддержку CP866 и передавать имена в OEM , т.к. ZIP исторически работает в OEM кодировке

fokinal21: спасибо, все пошло!

Andrey: Что-то мне непонятно, как это сделать. Имею такой код: 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. попробовал перекодировать массив - архив перестал собираться. Видать нужно другую функцию использовать.

Dima: Andrey пишет: Или можно сразу перекодировать aFiles, а функция сама возьмёт файлы в OEM кодировке ? за это время пока ты писал пост , мог бы 100 раз уже проверить своё предположение

Andrey: Да пока другую работу писал... Нашёл куда вставить. *------------------------------------------------------------------------------* 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

Haz: Andrey пишет: Нашёл куда вставить. поздравляю

Dima: Sergy пишет: Неожиданно обнаружил, что один из создаваемых в автоматическом режиме архивов оказался битый. Как решил вопрос ?

Dima: ZIP наливается на ФТП а в это время другая программа обнаруживает этот ZIP и пытается его распаковать но получает ошибку так как файл еще не дозалит. Не пойму как ловить в этом случае битый не битый архив. Наливаю ZIP на ФТП не я (не моя прога) , наливает планшет. У себя например делаю так , наливаю архив но с расширением TST к примеру и если заливка удачна переименовываю расширение на ZIP

PSP: Dima пишет: Не пойму как ловить в этом случае битый не битый архив. Если ошибка, вычисляешь контрольную сумму файла. Потом делаешь повторное чтение через некоторое время. Опять вычисляешь контрольную сумму. Сравниваешь их. Если разные, значит файл изменился и пробуешь распаковать. Если одинаковые, - значит битый.

Dima: PSP

Sergy: Dima пишет: Как решил вопрос? Сразу после создания архива - с помощью hb_GetFilesInZip() проверяю список файлов в нем. Должен совпадать со списком переданных. Далее беру его CRC32 и начинаю копирование. После копирования - сравниваю CRC32 копии. По времени задержка небольшая, бэкап делается в два места: на локальный диск и на файловый сервер.



полная версия страницы