Używam standardowej biblioteki Pythona, ZipFile, aby przetestować archiwum:

zf = zipfile.ZipFile(archive_name)
if zf.testzip()==None: checksum_OK=True

I otrzymuję ten wyjątek czasu wykonawczego:

File "./packaging.py", line 36, in test_wgt
    if zf.testzip()==None: checksum_OK=True
  File "/usr/lib/python2.7/zipfile.py", line 844, in testzip
    f = self.open(zinfo.filename, "r")
  File "/usr/lib/python2.7/zipfile.py", line 915, in open
    "password required for extraction" % name
RuntimeError: File xxxxx/xxxxxxxx.xxx is encrypted, password required for extraction

Jak mogę przetestować, zanim uruchomię Testzip (), jeśli Zip jest szyfrowany? Nie znalazłem wyjątku, który mógłby ułatwić to zadanie.

11
Eduard Florinescu 20 sierpień 2012, 17:18

2 odpowiedzi

Najlepsza odpowiedź

Szybki spojrzenie na Kod biblioteki ZipFile.py pokazuje, że możesz sprawdzić klasę ZipInfo Flag_bits Property, aby sprawdzić, czy plik jest szyfrowany, jak:

zf = zipfile.ZipFile(archive_name)
for zinfo in zf.infolist():
    is_encrypted = zinfo.flag_bits & 0x1 
    if is_encrypted:
        print '%s is encrypted!' % zinfo.filename

Sprawdzanie, czy ustawienie bitów 0x1 jest ustawione, jest sposób, w jaki źródło ZipFile.py widzi, czy plik jest zaszyfrowany (może być lepiej udokumentowany!) Jedną rzeczą, którą mógłbyś zrobić, to złapać runtimeError z Testzip (), a następnie pętla nad infoliistą () i Sprawdź, czy są szyfrowane pliki w ZIP.

Możesz także zrobić coś takiego:

try:
    zf.testzip()
except RuntimeError as e:
    if 'encrypted' in str(e):
        print 'Golly, this zip has encrypted files! Try again with a password!'
    else:
        # RuntimeError for other reasons....
13
Zachary Hamm 20 sierpień 2012, 13:45

Jeśli chcesz złapać wyjątek, możesz to napisać:

zf = zipfile.ZipFile(archive_name)
try:
    if zf.testzip() == None:
        checksum_OK = True
except RuntimeError:
    pass
0
Noctis Skytower 20 sierpień 2012, 13:29