Problem mit QFileWatcher unter Windows bei Dateien

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Hallo,

ich habe mir eine Klasse erstellt, die mit Hilfe von QFileWatcher ein Verzeichnis auf Änderungen überwachen soll.
Dafür erstelle ich mir einen Filewatcher, der von mir als zu überwachenden Pfad das Verzeichnis und alle darin enthaltenen Dateien bekommt.

In das Verzeichnis werden Log-Dateien von einem anderen Programm geschrieben, von dem ich leider nicht weiß, wie es die Dateien öffnet und die Daten schreibt.

Ich habe das Programm unter Linux geschrieben, und da funktioniert das wirklich gut. Das fremde Programm schreibt in die Log-Dateien Daten, die Change-Notification kommt an und ich lese den Inhalt der Datei um damit zu arbeiten.

Unter Windows klappt das nicht.
Wenn ich hier das Verzeichnis überwache, in das geschrieben wird, kommt das nicht in meinem Programm an.
Wenn ich jedoch das Verzeichnis im Explorer geöffnet habe und dort F5 drücke, bekommt mein Programm die Mitteilung der in der Zwischenzeit geänderten Dateien. Ebenso wenn ich die Datei einfach in einem Editor öffne. Es reicht das öffnen, ich muss da nichts speichern.

Es scheint so, als wenn diese Änderung in den Dateien irgendwo gebuffert wird, bis sie explizit angefordert wird. Ich könnte jetzt das Verzeichnis, bzw. die Dateien manuel abfragen, aber das finde ich eher unschön weil ich dadurch Resourcen verschwende.

Weiß jemand ob ich etwsa tun kann um das Problem zu beheben?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Ich habe mir jetzt erst einmal ein Workaround gebaut. Das ist zwar nicht schön aber funktioniert.

Ich prüfe jetzt jede Sekunde ob sich die Größe einer Datei geändert hat. Das ist leider der einzige Hinweis darauf, dass sich etwas in der Datei geändert hat, die das Programm noch zum Schreiben geöffnet hat.
Der Zeiteintrag der letzten Änderung scheint sich erst zu aktualisieren wenn die Datei geschlossen wird oder der Buffer geschrieben wurde.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@sparrow:
Schau mal hier: http://qt-project.org/forums/viewthread/42131, liest sich wie ein Bug.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Oha, ich bin bisher davon ausgegangen, dass jedes File in einem Verzeichnis einen eigenen QFileWatcher braucht. Denn "DirectoryChange" auf das Directory habe ich bisher nur bekommen, wenn eine Datei darin gelöscht oder neu angelegt wurde. bei einer Änderung noch nie.
Antworten