3 Stimmen

Erkennen von Änderungen in einem Dateisystem seit dem letzten Scan

Programme, die Dateisysteme indizieren, scheinen zu wissen, welche Teile sich seit der letzten Indizierung geändert haben und scannen nur diesen Teil erneut. Wie kann ich feststellen, wo sich das Dateisystem/die Dateien seit dem letzten Index geändert haben? Es ist mir egal, in welcher Sprache Sie antworten, aber ich denke an c und Windows.

Ein Beispiel für ein solches Programm ist Sequoia View, das eine Baumkarte Ihrer Festplatte erstellt.

6voto

cfeduke Punkte 22720

Eine recht einfache Methode wäre, die vom Dateisystem gemeldeten Dateigrößen, Datumsangaben (als Ganzzahlwerte) und Dateinamen in einem bestimmten Verzeichnis zu nehmen und eine Prüfsumme können Sie dann mit diesem Verzeichnis verknüpfen. Sie müssten diese Berechnung immer noch für alle Verzeichnisse anhand der Dateisystemdaten durchführen, aber Sie müssten nicht in die Tiefe gehen (Dateien öffnen, um auf Unterschiede zu prüfen), es sei denn, eine Prüfsumme meldet einen Unterschied.

Zur Verfolgung spezifischer Änderungen auf Dateiebene würden Sie Prüfsummen auf der Grundlage einzelner Dateiattribute und natürlich das Vorhandensein oder Fehlen von Dateien und Unterverzeichnissen seit der letzten Überprüfung speichern.

Dies ist nicht unbedingt eine Garantie dafür, dass keine Änderungen stattgefunden haben, da es Dateisystem-Dienstprogramme gibt, mit denen alle möglichen Attribute geändert werden können.

Vielleicht finden Sie die Quellcode para fswatch hilfreich.

4voto

Adrian Clark Punkte 12319

Wenn Sie in einer verwalteten .Net-Sprache programmieren, probieren Sie die FileSystemWatcher Klasse.

Von MSDN:

Verwenden Sie FileSystemWatcher zur Überwachung von Änderungen in einem bestimmten Verzeichnis. Sie können auf Änderungen in Dateien und Unterverzeichnissen des angegebenen Verzeichnisses. Sie können eine Komponente erstellen zur Überwachung von Dateien auf einem lokalen Computer, einem Netzlaufwerk oder einem entfernten Computer zu überwachen.

Um auf Änderungen in allen Dateien zu achten, setzen Sie die Eigenschaft Filter auf eine leere Zeichenkette ("") oder verwenden Sie Wildcards (" . "). Um eine bestimmte Datei zu beobachten, setzen Sie die Eigenschaft Filter Eigenschaft auf den Dateinamen. Für Beispiel: Um auf Änderungen in der Datei Datei MyDoc.txt zu überwachen, setzen Sie die Eigenschaft Filter Eigenschaft auf "MyDoc.txt". Sie können auch auf Änderungen in einem bestimmten Typ von Datei überwachen. Wenn Sie zum Beispiel nach Änderungen in Textdateien zu überwachen, setzen Sie die Eigenschaft Filter Eigenschaft auf "*.txt".

4voto

Sie haben es hier mit 2 Problemen zu tun.

Die erste ist, wenn Sie dynamische Änderungen (die während der Ausführung Ihres Programms vorgenommen werden) überwachen möchten. In diesem Fall müssen Sie die Windows-API ReadDirectoryChangesW verwenden. Es gibt zahlreiche Online-Beispiele für die Verwendung dieser API. (Vorsicht... einige Beispiele sind nicht sehr gut. Dieser API-Aufruf KANN UND WIRD mehr als ein Ereignis für jeden Aufruf zurückgeben, und Sie müssen die Schnittstelle sorgfältig lesen, verstehen, wie sie funktioniert, und ALLES verarbeiten, was zurückgegeben wird.

Das zweite Problem ist, wenn Sie einen Ordner oder eine Liste von Ordnern haben und überprüfen wollen, ob sich der Inhalt geändert hat - entweder durch Hinzufügen/Löschen oder Ändern von Dateien in diesem Ordner.

In diesem Fall besteht die effektivste Methode darin, den Inhalt des Ordners Dateinamen für Dateinamen zu lesen und einen kumulativen Hash zu erstellen. Darüber hinaus sollten Sie aber auch die Attribute auslesen (z. B. mit GetFileAttributesEx) und diese ebenfalls in den Hash einbeziehen. (Stellen Sie sicher, dass Sie die Ordner "." und ".." ausschließen - sonst sind die Ergebnisse irreführend).

Der Grund dafür ist, dass Sie Änderungen in einer Datei anhand ihrer Größe, ihres Datums usw. erfassen möchten. Wahrscheinlich wollen Sie die LastAccessed Zeit aber nicht einschließen.

Jede große Hashing-Funktion sollte ausreichen. Das Ergebnis ist eine einzige große Zahl (der Hash) für jeden Ordner.

Bei einem erneuten Durchlauf wird der Hash erneut berechnet und mit dem gespeicherten Hash des letzten bekannten Zustands des Ordners verglichen. Wenn die Hashes nicht übereinstimmen, müssen Sie den Ordner im Detail durchstöbern.

Dieser Ansatz zeigt Ihnen (schnell), dass es hier etwas gibt, das Sie sich genauer ansehen müssen, und wie Sie das tun, hängt davon ab, was Sie erreichen wollen.

Dies hat den Vorteil, dass Sie nicht den Inhalt jeder einzelnen Datei im Ordner betrachten, sondern stattdessen einige Metadaten, die Ihnen einen ausreichenden Hinweis geben. Die Verarbeitung ist somit um ein Vielfaches schneller.

3voto

Ferruccio Punkte 96076

1voto

Windows programmer Punkte 7727

FindFirstChangeNotification

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X