Как проверить, разделен ли zip-файл на несколько архивов, используя библиотеку zipfile python?

Согласно стандарту zip-файлов: http://www.pkware.com/documents/casestudies/APPNOTE.TXT также поддерживает разделение zip-файла на несколько файлов:

      Spanned/Split archives created using PKZIP for Windows
      (V2.50 or greater), PKZIP Command Line (V2.50 or greater),
      or PKZIP Explorer will include a special spanning 
      signature as the first 4 bytes of the first segment of
      the archive.  This signature (0x08074b50) will be 
      followed immediately by the local header signature for
      the first file in the archive.  

      A special spanning marker may also appear in spanned/split 
      archives if the spanning or splitting process starts but 
      only requires one segment.  In this case the 0x08074b50 
      signature will be replaced with the temporary spanning 
      marker signature of 0x30304b50.  Split archives can
      only be uncompressed by other versions of PKZIP that
      know how to create a split archive.

      The signature value 0x08074b50 is also used by some
      ZIP implementations as a marker for the Data Descriptor 
      record.  Conflict in this alternate assignment can be
      avoided by ensuring the position of the signature
      within the ZIP file to determine the use for which it
      is intended.  

Любая идея, как проверить эту подпись или другой способ проверить, разделен ли почтовый индекс на несколько файлов?


person Eduard Florinescu    schedule 20.08.2012    source источник


Ответы (1)


Конкретная подпись, о которой говорится в стандарте, т. е. PK\007\008, вообще не обрабатывается zip-файлом, как видно из исходного кода библиотеки (я получил тот же результат с Python 3.2):

# grep PK /usr/lib/python2.7/zipfile.py 

stringEndArchive = "PK\005\006"
stringCentralDir = "PK\001\002"
stringFileHeader = "PK\003\004"
stringEndArchive64Locator = "PK\x06\x07"
stringEndArchive64 = "PK\x06\x06"

Поэтому я сомневаюсь, что вы можете использовать библиотеку для этой цели. С тем же успехом можно попытаться найти эту подпись самостоятельно, расширив библиотеку.

person Dan Aloni    schedule 20.08.2012
comment
Любое предложение о том, как мне подойти к этому? - person Eduard Florinescu; 20.08.2012
comment
Вы можете попытаться создать экземпляр ZipFile поверх некоторых разделенных zip-файлов и посмотреть, как он сломается. Затем исправьте и добавьте код в класс ZipFile (где-то в методе «open»), который выдает хорошее исключение при наличии разделенного архива. Затем отправьте патч сопровождающим Python :) - person Dan Aloni; 20.08.2012
comment
Я думаю, что сейчас я поймаю RuntimeError на testzip()! - person Eduard Florinescu; 20.08.2012