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

Winzip: fileattribute

Beitragvon HarryH » Donnerstag 31. August 2006, 07:32

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

Beitragvon BlackJack » Donnerstag 31. August 2006, 11:44

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

re:

Beitragvon HarryH » Donnerstag 31. August 2006, 14:05

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

Beitragvon Nirven » Donnerstag 31. August 2006, 14:19

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

re:

Beitragvon HarryH » Freitag 1. September 2006, 06:38

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

Beitragvon BlackJack » Freitag 1. September 2006, 10:28

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

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder