Seite 1 von 1

Effizient Dateisystemstrukturen vergleichen

Verfasst: Mittwoch 8. August 2007, 17:20
von ws
Hallo,

gibt es in Python schon fertigen Code, um Directorystrukturen vergleichen zu können?

Mein Anwendungsfall ist folgender:
Ich scanne zu einem bestimmten Zeitpunkt ein Directory inklusive aller Subdirectories. Zu einem späteren Zeitpunkt möchte ich mit möglichst wenig Aufwand feststellen, ob und wenn ja was sich seit dem letzten Scan geändert hat, also:

-ob Dateisystem-Objekte hinzugekommen oder verschwunden sind
-ob sich Dateigrössen geändert haben
-ob Dateien/Directories in der Zwischenzeit modifiziert wurden

Das ganze sollte unter Windows und Linux laufen, deshalb sind FindFirstChangeNotification und ReadDirectoryChanges für mich erstmal nicht die Lösung.

Mit vielem Dank im Voraus

Wolfgang

Verfasst: Mittwoch 8. August 2007, 17:27
von veers
Hm ich hab das ganze bisher immer rekursiv mit os.listdir + os.stat gelöst. Wäre aber auch an einem eleganteren Weg interessiert.

Falls du noch etwas mehr Performance willst machst du das ganze in mehreren Threads so müsste sich die IO Auslastung etwas verbessern lassen. Habe es aber selber noch nie Probiert.

Edit:
Habe ich das richtig verstanden oder willst du "Realtime" über Dateiänderungen Informiert werden? Realtime müsste das unter Linux lowlevel mit inotify oder etwas höher mit gamin/fam gehen ;)

Verfasst: Mittwoch 8. August 2007, 21:12
von Sr4l
Ich habe eine Paket Manager geschrieben. Wo von Entwicklerseite nur geänderte Dateien hoch geladen werden und von Client Seite ebenfalls nur geänderte downgeloadet werden.

Ich habe das mit `os.walk` gelöst.

Code: Alles auswählen

for t in os.walk("/path"):
    #absoluter Pfad zu einem Ordner
    print t[0]  
    #Unterordner in diesem Ordner
    print t[1]
    #Datein in diseme Ordner
    print t[2]
os.walk 'läuft' bis zu untersten Datei und Ordner ;-)
Den Zustand der Datei habe ich mit einem MD5 Hash festgehalten und den Pfad zur Datei + Dateiname + Hash in einer Datei geschrieben.
zu Anfang der Zeile habe ich noch ein . oder : welches mir sagt ob die der Pfad zu einer Datei oder einem Ordner gehört aber da kann man sich noch viele Sachen überlegen um die os.walk mit anderen Daten zu erweitern.

Verfasst: Mittwoch 8. August 2007, 21:41
von veers
Naja der Punkt mit os.walk ist das os.walk selbst schon ein stat() macht die Resultate jedoch verloren gehen. Wenn du dann Dateigrösse/mtime wissen willst musst du das nochmal machen. Ich weiss jedoch noch wie "teuer" ein stat() ist. Werde das mach kurz nachmessen.

Edit: os.stat() scheint eine relativ billige Operation zu sein ist also vermutlich egal ;)

Verfasst: Donnerstag 9. August 2007, 15:49
von lunar
dircmp existiert.

Sorry, Mist geschrieben, es geht ja nicht um den Vergleich zweier existierender Verzeichnisse :oops:
phpbb lässt mich leider mein Posting nicht mehr löschen...

Verfasst: Donnerstag 9. August 2007, 17:17
von HWK
@Sr4l: So ähnlich habe ich das für mich auch gelöst, um bestimmte Verzeichnisse auf mehreren Rechnern identisch zuhalten. Das klappt momentan bei 175 Dateien mit über 20 MB so ganz gut. Ein Problem dürfte aber bei sehr vielen Dateien die Zeit für die Berechnung der MD5 jeder Datei sein.
MfG
HWK

Verfasst: Donnerstag 9. August 2007, 17:32
von BlackJack
Man kann das Berechnen einer Prüfsumme ja so weit wie möglich verzögern. Wenn man die `stat`-Informationen mitspeichert braucht man den Dateiinhalt nur vergleichen, wenn die Zeit und/oder Dateigrösse sich geändert hat.