[gelöst]Ordnereigenschaften auslesen(Anzahl Ordner/Dateien)

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
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Hallo liebe Community,
ich habe ein Problem an dem ich schon eine Weile zu knabbern habe.
Ich habe eine Methode geschrieben die mir ein Verzeichnis nach bestimmten Kriterien hin, nach bestimmten Dateien oder Ordnern durchsucht. Nun möchte ich die Zeit berechnen, die dafür benötigt wird.

Leider ist jedes Verzeichnis anders und ich benötige nun einige Faktoren um die Zeit so genau wie möglich bestimmen zu können.

Ich habe mir gedacht, das man auf die Eingenschaften eines Ordners zugreifen kann. Ich übergebe meiner Methode also einen Pfad: "C:\Test\MeineDaten" . In den Eigenschaften steht dieser Ordner enthält 8 Unterordner und 25 Datein. Anhand dieser Werte kann ich die Zeit ungefähr berechnen wenn ich die Zeit für das Durchsuchen von einem Ordner kenne. Dazu könnte man die Ordnergröße mit in die Rechnung einfließen lassen(Wie das geht weist ich schon).

Das Ganze möchte ich dann in einen Progress-Dialog einbauen. Hat jemand das schon mal gemacht oder hat vielleicht eine Idee?

Meine Methode sieht so aus (Bitte über den Inhalt der methode hinwegsehen, ist noch quick and dirty):

Code: Alles auswählen

def dirWalk(self, dir, option = 0):
    """walk a directory tree, using a generator
    """
    errorPool = ["System Volume Information", "Documents and Settings", \
                "Dokumente und Einstellungen", "ProgramData", "Programme", \
                "Program Files", "Users", "Windows" ]
    if option == 0:
        searchKey = "\\DatDbs"
    elif option == 1:
        searchKey = ".SIK"
    elif option == 2:
        searchKey = "\\Setup"
    elif option == 3:
        searchKey = ".bak"
    for element in os.listdir(dir):
        fullpath = os.path.join(dir, element)        
        if fullpath != dir + errorPool[0]\
            and fullpath != dir + errorPool[1]\
            and fullpath != dir + errorPool[2]\
            and fullpath != dir + errorPool[3]\
            and fullpath != dir + errorPool[4]\
            and fullpath != dir + errorPool[5]\
            and fullpath != dir + errorPool[6]\
            and fullpath != dir + errorPool[7]:
            if os.path.isdir(fullpath) and not os.path.islink(fullpath):
                if not len(os.listdir(fullpath)) and searchKey in fullpath:
                    yield fullpath + os.sep            
                else:
                    for x in self.dirWalk(fullpath, option):  # recurse into subdir
                        yield x    
           
            elif(searchKey in fullpath):
                if option == 0:
                    yield os.path.split(fullpath)[0]
                elif option == 1:
                    yield os.path.split(fullpath)[0]
                elif option == 2:
                    yield os.path.split(fullpath)[0]
                elif option == 3:
                    yield fullpath
Mit freundlichen Grüßen
schaf220
Zuletzt geändert von Schaf220 am Donnerstag 6. Oktober 2011, 07:24, insgesamt 1-mal geändert.
BlackJack

@Schaf220: Wieso zeigst Du uns die Funktion wenn wir dann doch nicht reinschauen sollen!? :twisted:

Ich hab's dummerweise doch getan, und Du hast Recht: da kann man einiges besser schreiben.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

@BlackJack: Stimmt das war blöd von mir =). Fangen wir am besten mit der Mathode an was fällt dir auf anhieb auf was du verbesern würdest?
BlackJack

@Schaf220: Das ist semantisch keine Methode. Also sollte man entweder eine Funktion daraus machen, oder den Umstand mit `staticmethod()` klar machen.

`dir` ist der Name einer eingebauten Funktion, den sollte man nicht an etwas anderes binden.

'\' zum fortsetzen von logischen Zeilen ist nicht nötig wenn es noch offene Klammern gibt, also zum Beispiel bei Listen.

Inhaltlich ist das mit den Optionen unschön. Wenn diese Sonderbehandlung von '.bak' nicht wäre, könnte man ja direkt `search_key` übergeben.

Ungetestet umgeschrieben:

Code: Alles auswählen

def dir_walk(dir, option=0):
    """Walk a directory tree, using a generator.
    """
    error_pool = [
        'System Volume Information',
        'Documents and Settings',
        'Dokumente und Einstellungen',
        'ProgramData',
        'Programme',
        'Program Files',
        'Users',
        'Windows',
    ]
    search_key = [r'\DatDbs', '.SIK', r'\Setup', '.bak'][option]

    for element in os.listdir(path):
        fullpath = os.path.join(path, element)
        if fullpath not in (path + e for e in error_pool):
            if os.path.isdir(fullpath) and not os.path.islink(fullpath):
                if search_key in fullpath and not os.listdir(fullpath):
                    yield fullpath + os.sep
                else:
                    for result in dir_walk(fullpath, option):
                        yield result
            elif search_key in fullpath:
                yield fullpath if option == 3 else os.path.dirname(fullpath)
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

@BlackJack: Danke für die Verbesserungen.

@All: Leider habe ich immer noch keine Idee wie ich die Zeit des Durchsuchvorgangs bestimmen kann. Hat Jemand eine Idee?
deets

Der immer wieder fuer Erheiterung sorgende Fortschrittsbalken des Windows-Explorers sollte dir eine Lehre sein, das eher nicht zu Ernst zu nehmen.

Wie dem auch sei: die einzige Moeglichkeit, sowas zu machen ist, zuerst die Anzahl der moeglichen Operationen zu bestimmen, und dann einen zB auf File-Groessen & Typen basierende Annahme zu treffen, wie lange das dauern wird. Das kann man dann noch on-the-fly verbessern (was dann wieder zu den lustig tanzenden Balken fuehrt), oder man bleibt bei seiner Annahme und ist halt frueher oder spaeter fertig.

Das alles lohnt sich natuerlich nur, wenn deine Ordner-Traversierung schnell genug geht, um den Benutzer nicht ewig warten zu lassen, und im Verhaeltnis dazu dann die eigentlichen Operationen (zB kopieren) langsamer sind. Sonst ist der notwendige doppelte Lauf zum Traversieren ein Aergernis.

Was *genau* du jetzt machen musst, kann ich dir nicht sagen - du verraetst ja nicht, was du eigentlich vor hast.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

@deets: Um die Anzahl der möglichen Operationen zu bestimmen dachte ich mir ja, die eigenschaften des Verzeichnisses auszulesen. Gibts es da nichts was man benutzen könnte? Man kann ja auch die Datei/Ordnergröße ermitteln oder die letzte Zugriffszeit.
lunar

@Schaf220: Es gibt keine Eigenschaft, über die man die Anzahl der Dateien in einem Verzeichnis bestimmen könnte. Die einzige Möglichkeit dazu ist, das Verzeichnis explizit aufzulisten, mit den erwähnten Nachteilen.
Benutzeravatar
Schaf220
User
Beiträge: 113
Registriert: Montag 11. August 2008, 16:00
Wohnort: Bremen
Kontaktdaten:

Vielen Dank für die Hilfe. Das ist echt ein super Forum. :D
Antworten