Verzeichnislog - oder so ähnlich

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
JohnDoe

Hallo, ich bin gerade etwas ratlos, deshalb lasst mich etwas weiter ausholen, es sieht so aus als hätte ich mich da ein wenig verrannt.

Folgendes Problem:

Ich möchte ein Verzeichnis überwachen und dabei zu jedem beliebigen Zeitpunkt anzeigen können wie das Verzeichnis ausgesehen hat - ohne jedoch die Dateien wiederherstellen zu können.

Der Log sollte in der Art sein von:

Code: Alles auswählen

"14. Dezember 2013, 19:34:01", "datei1.txt", "hashwert", "hinzugefügt"
"14. Dezember 2013, 19:34:02", "datei2.txt", "hashwert", "hinzugefügt"
"16. Dezember 2013, 18:25:23", "datei1.txt", "hashwert", "gelöscht"
Mittles time.time() würde man einen schönen Timestamp bekommen, der sich auch leichter verarbeiten lässt als so reine Datumsanzeigen - das kann man ja konvertieren bevor man es dem Nutzer letztlich zeigt. Das würde schonmal passen. Die Dateien die jetzt gerade im Verzeichnis vorhanden sind bekomme ich mittels os.walk() [ausschließlich Dateien, Ordner interessieren mich nicht]. Den Hashwert der Dateien rauszubekommen ist auch kein Problem.

Die Frage ist: Wenn ich jetzt aus den Logs weiß welche Dateien vorhanden sein müssten und ich eine Liste habe mit Dateien die tatsächlich da sind: Wie bekomme ich das sauber in eine Liste zusammengeklopft?

Wichtig ist auch dass man sehen kann, wann eine Datei gelöscht wurde. Dabei soll der Zeitpunkt genommen werden, an dem bemerkt wurde, dass die Datei fehlt.

Hat da jemand eine Idee wie ich das irgendwie sauber protokollieren kann? Jede Lösung die mir einfallen würde ist wahnsinnig umständlich, ich müsste mehrmals über jede Liste iterieren, die Unterschiede herausfinden, etc.

Tipps, Tricks, Vorschläge, Anregungen?
BlackJack

@JohnDoe: Das klingt nach Mengenoperationen, also dem Datentyp `set()`. Oder nach Wörterbüchern. Auf jeden Fall würde ich noch die Dateimodifikationszeit mit in die Daten aufnehmen. Daran kann man leicht vergleichen ob die Datei verändert wurde, ohne dass man sie noch mal komplett lesen muss.

Warum eigentlich `walk()` wenn Dich nur ein Verzeichnis interessiert?
JohnDoe

BlackJack hat geschrieben:Auf jeden Fall würde ich noch die Dateimodifikationszeit mit in die Daten aufnehmen. Daran kann man leicht vergleichen ob die Datei verändert wurde, ohne dass man sie noch mal komplett lesen muss.
Ja, gute Idee. Werde ich mitaufnehmen.
BlackJack hat geschrieben:Warum eigentlich `walk()` wenn Dich nur ein Verzeichnis interessiert?
Das Verzeichnis hat Unterverzeichnisse. Oder gibt es da eine andere Lösung?
BlackJack hat geschrieben:Das klingt nach Mengenoperationen, also dem Datentyp `set()`. Oder nach Wörterbüchern.
set() seh ich mir an, aber inwiefern würden hier Wörterbücher helfen?
Ausgehend davon das mit Wörterbüchern hashmaps (dict oder ähnliches) gemeint sind: Bräuchte man dafür nicht pro Logeintrag einen eindeutigen Key, welcher hier nicht wirklich gegeben ist?

Ich hätte auch schon daran gedacht das ganze in eine Datenbank zu schieben, Filter nach allen möglichen Kriterien würde man so sehr leicht umsetzen können. Nur wie ich den realen Zustand des Verzeichnisses dann in Einklang mit der Datenbank bringe ist wieder eine andere Frage.
BlackJack

@JohnDoe: Also interessiert Dich doch nicht nur *ein* Verzeichnis?

Wie Du das Log modellierst ist doch gar nicht die Frage sondern wie Du die aktuell bekannten Dateien modellierst. Und da bietet sich ein Wörterbuch an das Dateinamen auf die Daten abbildet. Dann kann man mit `dict.viewkeys()` was zumindest `set()`-ähnlich ist, die entsprechenden Mengen an entfallenen und dazugekommenen Dateien ermitteln. Das Log ist letztendlich dann ja nur eine „write only” Struktur.
JohnDoe

BlackJack hat geschrieben:@JohnDoe: Also interessiert Dich doch nicht nur *ein* Verzeichnis?
Das ist abhängig davon wie man den Begriff „Verzeichnis“ definiert. Lass es mich anders formulieren: Ich interessiere mich für alle Dateien die innerhalb eines Verzeichnisses und/oder dessen Unterverzeichnisse zu finden sind.

Die Idee mit dem Wörterbuch ist gut, ich hab nur wieder *etwas* zu kompliziert gedacht. Allerdings muss man dazu trotzdem über mindestens 2 Listen iterieren, einmal um fehlende Dateien und einmal um die neu hinzugekommenen Dateien zu finden. Und dann natürlich noch um herauszufinden welche Datei lediglich bearbeitet wurde über den geänderten Zeitstempel (und anschließend den Hashwert, da der Zeitstempel eigentlich nichts über die Datei aussagt).
BlackJack

@JohnDoe: Man muss aber nicht zwingend selber iterieren und auch nicht über Listen. Wie gesagt `set()`\s haben da nützliche Methoden.
Antworten