Forum: PC-Programmierung Benachrichtigung bei Datei-Update


von Günter R. (galileo14)


Lesenswert?

Hallo,

wenn ich mit meinem Programmier-Editor eine Datei bearbeite und diese 
gleichzeitig mit einem anderen Editor öffne (z.B. WordPad) und ebenfalls 
ändere und dann speichere und danach wieder in meinen Programmier-Editor 
wechsle, bekomme ich dort eine Meldung, daß meine Datei von anderer 
Seite her geändert worden sei, und ich habe die Option, die neue Version 
von Platte zuladen (unter Verlust es eben schon Editierten). Insofern 
verhält sich der Programmier-Editor (GW-Edit) optimal (WordPad kümmert 
sich nicht um soetwas, wenn man's in umgekehrte Richtung macht).

Hat jemand eine Idee, wie das bei mein Programmier-Editor programmiert 
worden sein könnte (außer der trivialen Lösung, beim Laden einer Datei 
deren Datei-Datum/Uhrzeit zu speichern und dies jedesmal zu prüfen, wenn 
das Editor-Fenster den Fokus erhält)?

Gibt es Windows-Nachrichten für solche Datei-Veränderungen?

Will ein Programm schreiben, das auf Veränderung einer Datei reagiert 
und dann ein Programm ausführt. Und möchte die naheliegende Methode, die 
zu überwachende Datei regelmäßig zu pollen und das Dateidatum 
anzufragen, nach Möglichkeit vermeiden.

Danke für Eure Ideen.

Günter

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dafür sind folgende Win32-API-Funktionen da:

FindFirstChangeNotification
FindNextChangeNotification
FindCloseChangeNotification

von Günter R. (galileo14)


Lesenswert?

Hallo, Rufus,

danke! Kennst Du Dich mit diesen Funktionen aus? Wann reagieren sie? 
Angenommen, ich aktiviere eine solche Notification auf eine bestimmte 
Datei und kopiere dann eine sehr große andere Datei auf diese, sodaß die 
notifizierte sich ändert; das Kopieren mag z.B. 10 Sekunden dauern. 
Kommt dann die Notification schon beim Beginn des Kopierens oder erst 
bei dessen Ende (was wünschenswert wäre)?

Günter

von Rufus Τ. F. (rufus) Benutzerseite


Angehängte Dateien:

Lesenswert?

Die Events werden aufgrund von Änderungen im überwachten Verzeichnis 
ausgelöst; die Dokumentation von FindFirstChangeNotification beschreibt 
verschiedene Konstanten für einen Filter, mit dem Änderungen an 
Dateinamen, Verzeichnisnamen, Dateiattribute, -Größe, -Schreibdatum und 
Sicherheitseinstellungen ausgefiltert werden können.

Du wirst in Dein Programm beim automatischen Datei-neu-laden die 
Rückgabewerte von CreateFile auswerten und sinnvoll darauf reagieren 
müssen, um Dateiblockaden (nicht abgeschlossener Kopiervorgang) zu 
erkennen und das Öffnen später erneut probieren.

Die Änderungszeit einer Datei wird beim Start des Kopiervorganges auf 
die aktuelle Zeit und nach Abschluss des Kopiervorganges auf die Zeit 
der Quelldatei gesetzt; es könnte also sein, daß hierfür sogar zweimal 
das Event signalisiert wird.

Wenn ich mich aber recht erinnere, werden diese Events eh mit einer 
gewissen Verzögerung (die durchaus im einstelligen Sekundenbereich 
liegen kann) generiert, so daß das Problem recht selten auftreten 
dürfte.

Achja: Anbei ein Codebeispiel aus der MS-Dokumentation. Vielleicht 
hilft's ja.

von Günter R. (galileo14)


Lesenswert?

Hallo, Rufus,

danke für das Textfile; es erklärt die Sache gut.

Ich habe jetzt mal einen anderen Ansatz verfolgt, der gut funktioniert 
(meine "triviale" Lösung): ich lese beim Start das File-Datum der zu 
überwachenden Datei und habe dann einen Timer aufgesetzt, der alle 
Sekunde (einstellbar) das File-Datum gegen den gespeicherten Wert prüft; 
bei Veränderung geht das Programm von einem neuen Datei-Inhalt aus und 
macht seine Arbeit (Einfügen einer Prüfsumme), speichert danach das 
jetzt aktuelle File-Datum und beginnt von vorn, bis ich abbreche.

Das funktioniert einwandfrei; die Notification-Lösung ist sicher 
professioneller; gelegentlich werde ich sie testen (gebe dann hier 
Bescheid).

Danke Dir.

Günter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.