2010-06-09 9 views
5

ich nach einer Möglichkeit, die Dateiattribute zu erhalten (z. B. schreibgeschützt) eine Datei, die auf eine zipfile.ZipFile Instanz geschrieben wird.Dateiattribute in ZipFile

Die Dateien hinzufügen ich das Zip-Archiv ihre Dateiattribute zurückgesetzt wird, zum Beispiel. Das Read-Only-Flag ist weg, wenn das Archiv mit ZIP-Anwendungen und nach dem Entpacken untersucht wird.

Meine aktuelle Umgebung ist von Windows und ich habe Probleme mit den ZipInfo.external_attr Verfahren mit.

Sicherlich muss es eine standardisierte Möglichkeit der Erhaltung der Dateiattribute, wenn zu ZipFile zu schreiben?

+0

Bitte bearbeiten Sie Ihre Frage und erklären Sie "Ich habe Probleme". Ansonsten können wir nicht helfen. –

+0

Die ursprüngliche Frage ist gültig. Das war nur eine Randbemerkung zu den Lösungen hier auf Stackoverflow diddnt Arbeit, da ich nicht für Unix implementiere. Schlechte Erklärung, Punkt genommen. – Elijah

Antwort

3

Das Problem, das ich hatte, war die stark undokumentierte zipfile.ZipInfo.external_attr. Alle Beispiele, die ich für dieses Objekt gefunden habe, beziehen sich auf den Berechtigungsstil * nix.

Meine Implementierung wird unter Windows ausgeführt. So

Ich ging über einige "Reverse Engineering". Heh.

Die magische Zahl für Fenster schreibgeschützt ZipInfo.external_attr ist 33.

Wie in:

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() 

Wenn Sie den richtigen Wert für eine andere Art von Attribut erstellen Sie die Zip-Datei, wie Sie finden müssen will es mit ein paar Windows-Zip-App und führen Sie diese auf:

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) 

Prost!

+0

Siehe auch http://stackoverflow.com/questions/434641/how-do-i-set-permissions-attributes-on-a-file-in-a-zip-file-using-pythons-zipf/6297838#6297838 . Sie haben recht mit dem undokumentierten Feld external_attr. –

+0

Ich habe das gleiche Problem bei der Verwendung von "Minizip" in Windows, um alle Dateiattribute vorzurücken. Ich habe den folgenden Code verwendet: DWORD attribs = GetFileAttributesW (szOut); \t \t zi.external_fa = attribs; –