Windows: Ordnergröße bestimmen

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.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 17. Dezember 2008, 08:49

Hallo,

ich suche momentan nach einer schnellen Lösung, die Größe eines Ordners zu ermitteln. Natürlich könnte man mit os.walk alles kompliziert aufsummieren - das dauert aber und ist etwas umständlich... Gibt es eine andere Lösung?

Danke!
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Mittwoch 17. Dezember 2008, 09:35

Hi

Eine andere Loesung als von jeder Datei die Groesse auszusummieren kenne ich nicht. Das ganze ist aber nicht wirklich schwierig und aufwaendig:

Code: Alles auswählen

def iter_files(path):
    for root, dirs, filenames in os.walk(path):
        for filename in filenames:
            yield os.path.join(root, filename)

def dir_size(directory):
    return sum(os.path.getsize(x) for x in iter_files(directory))
Gruss
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Mittwoch 17. Dezember 2008, 12:51

Unter Windows kann man so machen

Code: Alles auswählen

import win32com.client

def get_dirsize(dir2check):
    fso=win32com.client.Dispatch("Scripting.FileSystemObject")
    folder=fso.GetFolder(dir2check)
    total=folder.Size
    return total


print get_dirsize(path2query) #logischerweise mit einem gültigen Pfad aufrufen!
Ist 'nur' eine Kopie aus einem Modul, das ich mal geschrieben habe.


mfg, querdenker

EDIT : Code-Cleanup
Zuletzt geändert von querdenker am Donnerstag 18. Dezember 2008, 08:29, insgesamt 1-mal geändert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 17. Dezember 2008, 13:00

@querdenker: genau sowas habe ich gesucht! Danke!
BlackJack

Mittwoch 17. Dezember 2008, 13:15

@querdenker: Könntest Du mal kurz erklären, was Die Rechnung da soll? Laut MSDN ist `Size` die Grösse in Bytes, was veranstaltest Du da für komische Sachen mit!?

Und warum ``&`` statt ``and``?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 17. Dezember 2008, 13:27

Nun stehe ich leider vor einem Problem:

Code: Alles auswählen

def get_folder_size(self, path):
    try:
        fso = win32com.client.Dispatch('Scripting.FileSystemObject')
        size = fso.GetFolder(path).Size
    except Exception, e:
        print e
        size = 0
    return size

path = path.decode('iso-8859-2')
size = self.get_folder_size(path)
Fehlermeldung:

Code: Alles auswählen

(-2147221008, 'CoInitialize wurde nicht aufgerufen.', None, None)
Das ganze läuft in ein und demselben Thread. Habe leider nichts passendes zu diesem Fehler gefunden.

Jemand ein Ahnung was das sein könnte...?
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Mittwoch 17. Dezember 2008, 13:37

@BlackJack
Ich brauche für die Rechnungslegung MB, daher das "rumrechnen".

Warum '&' statt 'and'? Frag mich bitte nicht. Ich habe das Script damals zwischen dem Umzug einer Serverfarm und einem Servercrash (14 Datenbanken betroffen, die Kunden sollten am nächsten Tag wieder arbeiten) in einer Nacht- und Nebelaktion geschrieben. Die Zahlen waren damals plausibel, deswegen habe ich das so als i.O befunden.
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Mittwoch 17. Dezember 2008, 13:43

Ich glaube, daß das FileSystemObject auch nichts anderes macht, als
die einzelnen Größen zusammenzählen.
Es gibt nämlich irgendwo in der Registry einen Schlüssel, mit dem
man den Explorer anweisen kann, die Größen von Ordnern anzuzeigen.
Und der braucht genauso lang wie dein oben gezeigter Entwurf.
querdenker
User
Beiträge: 424
Registriert: Montag 28. Juli 2003, 16:19
Wohnort: /dev/reality

Mittwoch 17. Dezember 2008, 13:43

@SchneiderWeisse: Schau dir mal deinen Pfad an.

Code: Alles auswählen

>>> import win32com
>>> import win32com.client
>>> total=0.0
>>> fso=win32com.client.Dispatch("Scripting.FileSystemObject")
>>> folder=fso.GetFolder('c:/devel')
>>> total=folder.Size
>>> print total
161771596
>>> total2=0.0
>>> total2=fso.GetFolder('c:/devel').Size
>>> total2
161771596
>>>
Mal gerade in der Shell durchgehackt, geht.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 17. Dezember 2008, 13:48

sehr komisch, wenn ich die "Pfade" ausgebe per print und danach manuell in der IDLE eingebe funktioniert es, im Skript nicht...

http://paste.pocoo.org/show/95731/
BlackJack

Mittwoch 17. Dezember 2008, 14:10

@querdenker: Und was soll das `round()`? Solange Du kein ``from __future__ import division`` ganz oben stehen hast, kommt bei der Rechnung immer eine ganze Zahl heraus, aus der Du dann per `round()` erst eine Fliesskommazahl machst, um diese dann sofort wieder in eine ganze Zahl umzuwandeln. Also zwei Umwandlungen die im Endeffekt *nichts* bewirken.

Und warum bindest Du Namen an ein Objekt, die Du kurz darauf an etwas anderes bindest!? ``total = 0.0`` ist total sinnfrei.

Wann sollte `final` bei der ``if``-Anfrage jemals kleiner als 0 werden? Und warum vergleichst Du die ganze Zahl `total` mit einer Fliesskomma-Null?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 17. Dezember 2008, 14:13

windner hat geschrieben:Ich glaube, daß das FileSystemObject auch nichts anderes macht, als
die einzelnen Größen zusammenzählen.
Ja, das nehme ich auch stark an. Somit hat man aus einem platformunabhängigen Code einen Windows-only-Code gemacht der keinen Nutzen hat und zusätzlich noch pywin32 vorraussetzt. Das könnte man direkt Anti-Optimierung nennen :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Mittwoch 17. Dezember 2008, 14:53

naja, erstens: Mein Programm ist nur für Windows ausgelegt und zweitens ist die Methode mit win32com um ein vielfaches schneller.

Trotzdem wäre es ganz hilfreich, wenn jemand etwas mit ->meinem<- Problem anfangen könnte...;)
windner
User
Beiträge: 76
Registriert: Freitag 19. Oktober 2007, 11:25

Mittwoch 17. Dezember 2008, 15:05

Leonidas hat geschrieben:Das könnte man direkt Anti-Optimierung nennen.
:twisted:
Wollte auch sowas sagen, habe mich aber nicht getraut.
zweitens ist die Methode mit win32com um ein vielfaches schneller.
Ehrlich?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mittwoch 17. Dezember 2008, 15:09

SchneiderWeisse hat geschrieben:zweitens ist die Methode mit win32com um ein vielfaches schneller.
Ich fordere zwei minimale Programme die beide Methoden benutzen zu Benchmarken, mit einsprechend großen Ordnern und entsprechend vielen Durchläufen. Weder NFTS noch FAT halten die Ordnergröße AFAIR irgendwo vor, also kann ich es schwer glauben dass da besonders große Unterschiede auftreten werden.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Antworten