Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dateiänderungen protokollieren (https://www.delphipraxis.net/186165-dateiaenderungen-protokollieren.html)

joehoehal 9. Aug 2015 21:22

Dateiänderungen protokollieren
 
Hallo,
ich möchte für ein gezieltes Backup protokollieren, welche Dateien in einem vorgegebenen Verzeichnis innerhalb eines bestimmten Zeitraums neu angelegt oder geändert wurden. Dafür habe ich auf http://www.torry.net/pages.php?id=252 ATFileNotification gefunden. Die Komponente soll bei jeder Dateiänderung im o. g. Sinne ein Ereignis OnChanged auslösen, was auch problemlos funktioniert. Leider habe ich aber keinen Weg gefunden festzustellen, welche Datei geändert worden ist. Kann jemand helfen?

Dejan Vu 10. Aug 2015 06:50

AW: Dateiänderungen protokollieren
 
Wie wäre es stattdessen, beim Sichern das 'Archive'-Flag der Datei zurückzusetzen? Bei jeder Änderung wird das nämlich eh automatisch gesetzt.

Du musst also nur die Dateien berücksichtigen, bei denen das Archiv-Bit gesetzt ist. (Siehe 'FindFirst', Attribute und 'faArchive')

Bezüglich deiner Frage: Ich habe mir beholfen, indem ich immer das Verzeichnis vergleiche. D.h. vorher vs. nachher. Nach dem Vergleich (also wenn das Event eingetreten ist), setze ich 'vorher := nachher'. Bei der nächsten Änderung/Event lese ich das Verzeichnis wieder ein, vergleiche usw.

Es gibt bestimmt einfachere Möglichkeiten. Wenn Du aber ein Backup programmieren sollst, würde ich mir meine Alternativlösung mal anschauen.

PS: Du kannst auch eine der anderen Lösungen auf Torry ausprobieren, dieser 'DirMonitor' wirbt ja gerade mit den Features, nach denen Du suchst'.
Zitat:

Monitored Events:
•File/Folder Creation, Modify, Change, Deletion, Rename.
•Security changes.
•A single notification for every event.
•Subdirectory notification.
•The event receives the Path + File Name affected and selected Action.

p80286 10. Aug 2015 10:04

AW: Dateiänderungen protokollieren
 
Weiterhin gibt es ja auch das Datum des letzten Zugriffs und für die letzte Änderung. Wenn da nicht "Touch" im Spiele ist, sollten diese Daten recht zuverlässig sein.

Gruß
K-H

hanvas 10. Aug 2015 16:48

AW: Dateiänderungen protokollieren
 
Zitat:

Zitat von joehoehal (Beitrag 1311620)
Hallo,
Leider habe ich aber keinen Weg gefunden festzustellen, welche Datei geändert worden ist. Kann jemand helfen?

Wenn Performance nicht der Maßstab ist, entweder viel Speicher zur Verfügung steht oder die Anzahl der Dateien klein ist, könntest Du für jedes zu überwachende Verzeichnis initial eine Dateiliste anlegen. Jedes Datum der Liste müsste die Daten enthalten (Namen,Änderungsdatum,Dateigröße) etc.

Zum Zeitpunkt der Änderung erstellst Du eine neue Liste, anschließend vergleichst Du die beisten Liste. Die Unterschiede in den Listen sind die Änderungen die zwischen dem Zeitpunkt der Erstellung der ersten Liste und dem Zeitpunkt der Erstellung der zweiten Liste aufgetreten sind.

cu Ha-Jö

Perlsau 10. Aug 2015 17:19

AW: Dateiänderungen protokollieren
 
Im Grunde würde es genügen, den vollständigen Dateinamen sowie das Änderungsdatum (zuletzt geändert) zu speichern und zu vergleichen, wenn man lediglich herausfinden möchte, welche Datei geändert wurde. Die Dateigröße liefert diesbezüglich keine weitere Information, denn eine abweichende Dateigröße würde ebenso wie ein abweichendes Änderungsdatum lediglich darauf hinweisen, daß Änderungen erfolgt sind. Um zu verfolgen, was genau geändert wurde, benötigt man einen Mirror, also ein komplette Doppel der zu überwachenden Dateien.

DeddyH 10. Aug 2015 20:26

AW: Dateiänderungen protokollieren
 
Wie bereits erwähnt ist seit ewigen Zeiten das Archiv-Bit für so etwas vorgesehen. Wenn man sich darauf nicht verlassen will, könnte man auch eine kleine Datenbank einrichten, in der man den Verzeichnisnamen, den Dateinamen sowie einen Hash der Datei ablegt. Findet man die Verzeichnis-/Dateikombination nicht oder stimmt der Hashwert nicht überein, muss die Datei gesichert und der DB-Eintrag hinzugefügt bzw. aktualisiert werden. Das nur als Anregung.

joehoehal 10. Aug 2015 21:06

AW: Dateiänderungen protokollieren
 
Danke für die vielen Antworten!
Die Vorschläge zur Abfrage von Flags, Zeitstempeln usw. sind allerdings genau das, was ich nicht will. Ich möchte am Ende des Beobachtungszeitraums eine Liste der geänderten Dateien haben und nicht zeitraubend unzählige Dateien auf Änderungen überprüfen. Aber der Tipp von Dejan Vu war der richtige! Ich habe zwar noch nicht alles ausprobiert, aber ich denke, dass ich damit mein Problem lösen kann. Dafür noch mal danke!
Gruß!
joeheohal

HolgerX 11. Aug 2015 07:41

AW: Dateiänderungen protokollieren
 
Hallo

ich weiß nicht, wie die ganzen Komponenten auf torry.net funktionieren, jedoch hatte ich mir mal hierfür eine eigene Komponente gebastelt und hierfür einen Thread verwendet, welcher mit GetQueuedCompletionStatus und ReadDirectoryChanges arbeitet.

Stichworte:
CreateFile(

CreateIoCompletionPort(
ReadDirectoryChanges(

-> Thread:
GetQueuedCompletionStatus(
ReadDirectoryChanges(


Hiermit kannste (nach GetQueuedCompletionStatus) aus dem NotificationBuffer auslesen, welche Änderung innerhalb des mit CreateFile angegebenen Verzeichnisses stattgefunden haben, incl FileName.

z.B.:
FILE_ACTION_ADDED,FILE_ACTION_REMOVED,FILE_ACTION_ MODIFIED,FILE_ACTION_RENAMED_OLD_NAME, FILE_ACTION_RENAMED_NEW_NAME

Dies funktioniert auch mit den darunter liegende Unterverzeichnissen.

Leider kann ich die Komponente nicht veröffentlichen.
Aber vielleicht kannste ja mit den Stichworten etwas anfangen.

Edit:
Hab da einen Link gefunden

http://www.delphipages.com/forum/arc...p/t-23547.html

joehoehal 11. Aug 2015 09:23

AW: Dateiänderungen protokollieren
 
Hallo HolgerX,
dein Vorschlag sieht dem sehr ähnlich, was ich in der Komponente DirMonitor auf Torry gefunden habe. Ich werde weiter versuchen, damit mein Problem zu lösen und auch das Ergebnis posten.
Gruß!
joehoehal


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz