Hallo,
Wenn ich ein mit Winzip erstelltes Archiv mit dem Modul zipfile öffnen und mir über den key "external_attr", die File-Attribute der komprimierten Dateien hole, erhalte ich rießengroße Zahlen (10-stellig).
Die Fileattribute einer Datei unter Windows, sehen aber folgendermaßen aus:
O | 4096 | FILE_ATTRIBUTE_OFFLINE
C | 2048 | FILE_ATTRIBUTE_COMPRESSED
T | 256 | FILE_ATTRIBUTE_TEMPORARY
N | 128 | FILE_ATTRIBUTE_NORMAL
A | 32 | FILE_ATTRIBUTE_ARCHIVE
D | 16 | FILE_ATTRIBUTE_DIRECTORY
S | 4 | FILE_ATTRIBUTE_SYSTEM
H | 2 | FILE_ATTRIBUTE_HIDDEN
R | 1 | FILE_ATTRIBUTE_READONLY
Eine entsprechende Addition der Werte ergibt dann die jeweilige Kombination der Attribute.
Warum erhalte ich aber bei einer Zipdatei, erstellt durch Winzip, 10-stellige Zahlen? Wie kann ich sie umrechnen?
Winzip: fileattribute
Wahrscheinlich werden dort noch mehr Attribute kodiert. Beschränk Dich doch einfach auf die Dir bekannten.
Man kann das zwar auch als Aufaddieren sehen aber eigentlich wird eine Oder-Verknüpfung der Bits vorgenommen. Durch eine Und-Verknüpfung bekommst Du heraus ob das jeweilige Bit gesetzt ist.
Man kann das zwar auch als Aufaddieren sehen aber eigentlich wird eine Oder-Verknüpfung der Bits vorgenommen. Durch eine Und-Verknüpfung bekommst Du heraus ob das jeweilige Bit gesetzt ist.
Code: Alles auswählen
x = 4 | 8 #setzen der Bits
x & 4 #prüft ob 4 gesetzt ist
4
Wenn ich also oben x mit 12 vergleiche kommt als Ergebniss 12 (4 und 8). Vergleiche ich mit 9, kommt nur die 8. Ein Vergleich mit 5 bringt auch die 4, mit 3 gibt wieder 0 zurück... war das verständlich?
Super! Danke es funktioniert.
Habe folgende Funktion geschrieben:
Sie konvertiert einen integer Wert in die entsprechenden Stringflags.
Habe folgende Funktion geschrieben:
Code: Alles auswählen
_attributes = (('R', 1), ('H', 2), ('S', 4), ('D', 16), ('A', 32),
('N', 128), ('T', 256), ('C', 2048), ('O', 4096))
def IntToStr(v):
"""
Converts fileattributes from integer to string
value = int
"""
mode = ""
for attr in _attributes:
if (v & attr[1]) == attr[1]:
mode += attr[0]
return mode
Gruß, Harry
Ich habe ja immer die dumme Angewohnheit Indices loswerden zu wollen, weil konkrete Namen verständlicher sind als Indexzugriffe:
Code: Alles auswählen
def rights_int2str(value):
mode = ''
for character, bitvalue in _attributes:
if v & bitvalue:
mode += character
return mode