2010-06-09 12 views
5

Poszukuję sposobu zachowania atrybutów pliku (np. Tylko do odczytu) pliku, który zostanie zapisany w instancji zipfile.ZipFile.Zachowaj atrybuty plików w pliku ZipFile

Pliki dodawane do archiwum zip zostają przywrócone, np. Flaga "tylko do odczytu" zniknęła podczas sprawdzania archiwum za pomocą aplikacji zip i po rozpakowaniu.

Moje obecne środowisko to Windows i mam problem z metodą ZipInfo.external_attr.

Z pewnością musi istnieć standardowy sposób zachowania atrybutów plików podczas zapisywania do ZipFile?

+0

Edytuj pytanie i wyjaśnij "Mam problemy". W przeciwnym razie nie możemy pomóc. –

+0

Oryginalne pytanie jest prawidłowe. To była tylko strona uwaga na temat rozwiązań tutaj na stackoverflow diddnt pracy, ponieważ nie jestem realizacji dla systemu Unix. Złe wyjaśnienie, punkt wzięty. – Elijah

Odpowiedz

3

Problemem był bardzo nieudokumentowany plik zipfile.ZipInfo.external_attr. Wszystkie przykłady, które znalazłem w tym obiekcie, zostały uzupełnione stylem uprawnień do plików * nix.

Moja implementacja będzie działać w systemie Windows.

Więc poszedłem o "inżynierii wstecznej". Heh.

magiczna liczba dla okien tylko do odczytu ZipInfo.external_attr jest 33.

Jak w:

z = zipfile.ZipFile(targetFile, 'w') 
(path, filename) = os.path.split(sourceFile) 
bytes = file(sourceFile, 'rb') 
info = zipfile.ZipInfo(filename) 
info.external_attr = 33 
z.writestr(info, bytes.read()) 
bytes.close() 
z.close() 

Jeśli trzeba znaleźć właściwą wartość dla innego rodzaju atrybutu stworzyć zipfile jak ty chcesz to zrobić z aplikacją zip z systemem Windows i uruchom ją:

z = zipfile.ZipFile(sourceFile, 'r') 
info = z.getinfo('fileToTest.ext') 
print ("create_system", info.create_system) 
print ("external_attr", info.external_attr) 
print ("internal_attr", info.internal_attr) 

Pozdrawiam!

+0

Zobacz także http://stackoverflow.com/questions/434641/how-do-i-set-permissions-attributes-on-a-file-in-a-zip-file-using-pythons-zipf/6297838#6297838 . Masz rację co do nieudokumentowanego pola external_attr. –

+0

Podczas korzystania z "minizip" w oknach dostałem się do tego samego problemu, aby zachować wszystkie atrybuty plików. Użyłem następującego kodu: atrybuty DWORD = GetFileAttributesW (szOut); \t \t zi.external_fa = attribs; –

Powiązane problemy