Seite 1 von 1

Winzip: fileattribute

Verfasst: Donnerstag 31. August 2006, 07:32
von HarryH
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?

Verfasst: Donnerstag 31. August 2006, 11:44
von BlackJack
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.

re:

Verfasst: Donnerstag 31. August 2006, 14:05
von HarryH
Hallo BlackJack,

Was meinst du damit?:
Durch eine Und-Verknüpfung bekommst Du heraus ob das jeweilige Bit gesetzt ist.

Verfasst: Donnerstag 31. August 2006, 14:19
von Nirven

Code: Alles auswählen

x = 4 | 8 #setzen der Bits
x & 4 #prüft ob 4 gesetzt ist
4
Wenn du prüfst kommt entweder eine Null zurück (keine Übereinstimmung) oder eine Addition sämtlicher binärer Werte, die auf beiden Seiten gesetzt sind.

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?

re:

Verfasst: Freitag 1. September 2006, 06:38
von HarryH
Super! Danke es funktioniert.

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
Sie konvertiert einen integer Wert in die entsprechenden Stringflags.

Verfasst: Freitag 1. September 2006, 10:28
von BlackJack
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