Автор | Сообщение |
|
| |
Пост 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: 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
[только новые]
|
|