Форум » [x]Harbour » Чем лучше протестировать ZIP-файл на ошибки ? » Ответить

Чем лучше протестировать ZIP-файл на ошибки ?

Softlog86: Скачиваю .ZIP архивы по FTP . Иногда с ошибками приходят (бывает что на FTP уже с ошибкой лежит , хотя - красивый такой) Требуется проверить на наличие ошибок в архиве , чтоб предпринять какие-то действия перед распаковкой архива . В архиве несколько файлов . Поможете ? :)

Ответов - 12

santy: Когда формируется архивный файл (инсталяции программ и тд) формируется файл с контрольной сумой данного файла (MD5). Берёте этот код, подсчитываете контрольную суму вашего архива (утилит много : fciv.exe, md5sum.exe) сравниваете. Файл с ошибками открывается в программе?

Dima: Как то так. [pre2] azip:=hb_GetFilesInZip("test.zip") if len(azip)==0 ? "Архив битый" endif [/pre2]

Softlog86: Последовательность действий такая : Кто-то из клиентов формирует у себя архив ZIP (программой на HARBOUR) , затем передаёт в хранилище (по FTP) . Другой пользователь принимает этот файл из хранилища ( по FTP) .... и пытается извлечь из него файлы .... Если были ошибки - программа вываливается . Хочется узнать - архив битый или нет , прежде чем пытаться разархивировать. Внешние утилиты не буду использовать . Должно быть средство проверки целостности архива . На крайняк - перехватывать ошибку и разбирать . Ошибка может возникнуть и при передаче в хранилище и при скачивании с него . PS : Дима , дело в том что даже битый архив (гад!) показывает что там есть файлы и т д ... то есть с виду всё гуд . Но он запорчен . Пока вижу как простой вариант - передавать вместе с архивом и 'описание' - например длину файла в байтах или контрольную сумму


santy: Попробуйте поработать с контрольной сумой, вместе с архивом создаётся файл с контрольной сумой данного архива.

Dima: Softlog86 У меня похожая задача и тоже файлы (ZIP) приходят с ФТП При чем связка hb_GetFilesInZip и далее HB_UNZIPFILE не подводит уже много лет. Архивы на ФТП тоже ложит моя программа(другая) но в ней стоят проверки на корректность переданного файла. При чем сразу я передаю ZIP не как TEST.ZIP а как TEST.TST и если передача успешна то переименовываю его в TEST.ZIP прямо на ФТП. Почему расширение сразу не ZIP ? А потому что как только файл начал заливаться на ФТП он там уже доступен хотя может быть еще и не залит до конца. Вариант с контрольной суммой тоже нормальный !

PSP: Dima пишет: потому что как только файл начал заливаться на ФТП он там уже доступен хотя может быть еще и не залит до конца Вот это, думаю, и есть причина скачивания "битых" zip-ов.

Softlog86: Кстати - по поводу заливки на ФТП с ошибкой .... очень может быть что в тот момент как я заливаю - кто-то его уже тащит .... и проблема . ? Как средствами HARBOUR/MINIGUI получить контрольную сумму и проверять её ? При переименовывании файла НА ФТП - старый обязательно удалять или ренэйм в '.OLD' ?

Dima: Softlog86 пишет: ? При переименовывании файла НА ФТП - старый обязательно удалять или ренэйм в '.OLD' ? От твоей задачи зависит. Поиграйся. У себя сразу , в случае удачной передачи делаю ренейм.

Dima: Softlog86 пишет: ? Как средствами HARBOUR/MINIGUI получить контрольную сумму и проверять её HB_MD5FILE

santy: HB_MD5File() Calculates a message digest for a file using the MD5 algorithm. Syntax HB_MD5File( <cFileName> ) --> cMD5 Arguments <cFileName> This is a character string holding the name of the file to process. It must include path and file extension. If the path is omitted from <cFileName>, the file is searched in the current directory. Return The function returns a character string of 32 characters which is the message digest of the file specified. Description HB_MD5File() does the same as HB_MD5() but processes an entire file rather than a character string. The result is the message digest of the file <cFileName> which can be used to detect if the file is changed. // The example implements a simple command line tool that // displays the MD5 message digest of a file. PROCEDURE Main( cFileName ) IF PCount() > 0 .AND. File( cFileName ) ? HB_MD5File( cFileName ) ELSE ? "Usage: MD5File <filename>" ENDIF RETURN

petr707: ...передавать вместе с архивом и 'описание' - например длину файла в байтах или контрольную сумму Именно, только не вместе, а только после того, как полностью пройдет UPLOAD. Выгрузку основного большого TEST.ZIP нужно делать под другим именем, например TEST.TMP, чтобы читающий FTP не начал делать DOWNLOAD до окончания UPLOAD. После завершения UPLOAD TEST.TMP его нужно переименовать на FTP в TEST.ZIP (это быстрая операция), и только затем сделать UPLOAD файла описания TEST.TXT, в котором кстати и указано - целевое имя TEST.ZIP, его размер, к.сумма и т.д. Читающий FTP - читает сначала TEST.TXT и только потом находит в нем имя основного файла для DOWNLOAD

Dima: Вообще если нужно минимум переделок то надо доработать программу которая заливает на фтп архивы. А именно: после передачи проверить длину файла в байтах переданного и исходного который наливался. Если длина совпала (и файл есть на фтп) тогда делаем oFtp:rename



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