Winzip: fileattribute

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

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?
Gruß, Harry
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.
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

Hallo BlackJack,

Was meinst du damit?:
Durch eine Und-Verknüpfung bekommst Du heraus ob das jeweilige Bit gesetzt ist.
Gruß, Harry
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

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?
HarryH
User
Beiträge: 266
Registriert: Freitag 23. Mai 2003, 09:08
Wohnort: Deutschland

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.
Gruß, Harry
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
Antworten