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
Effizient Dateisystemstrukturen vergleichen
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
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
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
- Sr4l
- User
- Beiträge: 1091
- Registriert: Donnerstag 28. Dezember 2006, 20:02
- Wohnort: Kassel
- Kontaktdaten:
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.
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.
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]
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.
- veers
- User
- Beiträge: 1219
- Registriert: Mittwoch 28. Februar 2007, 20:01
- Wohnort: Zürich (CH)
- Kontaktdaten:
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
Edit: os.stat() scheint eine relativ billige Operation zu sein ist also vermutlich egal
@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
MfG
HWK
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.