Effizient Dateisystemstrukturen vergleichen

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
ws
User
Beiträge: 65
Registriert: Freitag 16. Juni 2006, 13:19

Mittwoch 8. August 2007, 17:20

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
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mittwoch 8. August 2007, 17:27

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 ;)
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Mittwoch 8. August 2007, 21:12

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.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Mittwoch 8. August 2007, 21:41

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 ;)
lunar

Donnerstag 9. August 2007, 15:49

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...
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Donnerstag 9. August 2007, 17:17

@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
BlackJack

Donnerstag 9. August 2007, 17:32

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.
Antworten