2010-06-09 19 views
5

Je cherche un moyen de préserver les attributs de fichier (par exemple, en lecture seule) d'un fichier qui est écrit dans une instance zipfile.ZipFile.Préserver les attributs de fichier dans ZipFile

Les fichiers que j'ajoute à l'archive zip sont réinitialisés, par ex. le drapeau en lecture seule est parti lors de l'inspection de l'archive avec des applications zip et après unzip.

Mon environnement actuel est Windows et j'ai des problèmes avec la méthode ZipInfo.external_attr.

Sûrement il doit y avoir une manière standard de préserver les attributs de fichier lors de l'écriture à ZipFile?

+0

Veuillez éditer votre question et expliquer "J'ai des problèmes". Sinon, nous ne pouvons pas aider. –

+0

La question originale est valide. Ce fut juste une note secondaire sur les solutions ici sur stackdflow diddnt travail, puisque je ne suis pas l'implémentation pour unix. Mauvaise explication cependant, point pris. – Elijah

Répondre

3

Le problème que j'avais était le zipfile.ZipInfo.external_attr lourdement non documenté. Tous les exemples que j'ai trouvés de cet objet se réfèrent au style d'autorisation du fichier * nix.

Mon implémentation va s'exécuter sur Windows.

Je suis donc passé à la "reverse engineering". Il h.

Le nombre magique pour les fenêtres en lecture seule ZipInfo.external_attr est 33.

Comme dans:

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

Si vous avez besoin de trouver la valeur correcte pour un autre type d'attribut créer le fichier zip que vous le veulent avec quelques applications de zip de Windows et exécutent ceci là-dessus:

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) 

Cheers!

+0

Voir aussi http://stackoverflow.com/questions/434641/how-do-i-set-permissions-attributes-on-a-file-in-a-zip-file-using-pythons-zipf/6297838#6297838 . Vous avez raison sur le champ external_attr non documenté. –

+0

J'ai rencontré le même problème en utilisant "minizip" dans Windows pour presereve tous les attributs de fichier. J'ai utilisé le code suivant: DWORD attribs = GetFileAttributesW (szOut); \t \t zi.external_fa = attribs; –