Lesen einer Datei + Prüfung
Lesen einer Datei + Prüfung
hallo,
ich habe da ein kleines problem.
Ein externens Programm schreibt mir in ein Verzeichnis Dateien. Ich prüfe mit meinem zyklisch diese Dateien ab und werte sie aus. Das soll aber erst geschehen, wenn die Dateien vollständig auf der Festplatte liegen.
Kann ich das irgendwie prüfen, wann eine Datei feritg geschreiben ist und nicht mehr vom externen Programm verwendet wird?
gruß
anno1988
ich habe da ein kleines problem.
Ein externens Programm schreibt mir in ein Verzeichnis Dateien. Ich prüfe mit meinem zyklisch diese Dateien ab und werte sie aus. Das soll aber erst geschehen, wenn die Dateien vollständig auf der Festplatte liegen.
Kann ich das irgendwie prüfen, wann eine Datei feritg geschreiben ist und nicht mehr vom externen Programm verwendet wird?
gruß
anno1988
Bei Windows gibt es einen Mechanismus, mit dem man sich benachrichtigen lassen kann, wenn sich in einem Verzeichnis oder bei einder Datei etwas verändert.
Muss mal schauen, ob man sich da mit Qt anhängen kann.
Eigentlich ist es ne Windows-Nachricht, die vom OS gesendet wird.
Muss mal schauen, ob man sich da mit Qt anhängen kann.
Eigentlich ist es ne Windows-Nachricht, die vom OS gesendet wird.
Linux, das längste Text-Adventure aller Zeiten
Du meinst wohl QFileSystemWatcher http://doc.trolltech.com/4.2/qfilesystemwatcher.htmlAuE hat geschrieben:Wann löst der QDirectoryWatcher denn sein Signal aus?
Linux, das längste Text-Adventure aller Zeiten
Hi,
hast Du die Möglichkeit im schreibendem Programm die Datei zu sperren? Es gibt OS Funktionen die eine Datei sperren kann. Im Lesendem Prozess musst Du dann auf die Freigabe warten. Schau mal hier http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html (ist zwar C und Unix aber schonmal ein Ansatz)
Dann gibt es da noch den Semaphoren Ansatz, der über Prozessgrenzen Betriebsystem Mittel sperren kann (ähnlich dem Mutex).
Wenn das zu kompliziert ist, kann der schreibende Prozess ja auch eine ".lock" Datei schreiben (statt lock vieleicht der original Dateiname mit einem Punkt davor). Der lesende Prozess prüft ob so eine Datei vorhanden ist, und wartet solange bis die Datei gelöscht wurde.
Bei diesem Mechanismus musst Du aber den schreibenden Prozess ändern.
Wenn das nicht geht, dann wäre eine quick-dirty Lösung zu prüfen ob sich die Dateigrösse in einer gewissen Zeit noch ändert. Ist etwas fehleranfällig, aber könnte funktionieren.
Grüße
André
hast Du die Möglichkeit im schreibendem Programm die Datei zu sperren? Es gibt OS Funktionen die eine Datei sperren kann. Im Lesendem Prozess musst Du dann auf die Freigabe warten. Schau mal hier http://www.ecst.csuchico.edu/~beej/guide/ipc/flock.html (ist zwar C und Unix aber schonmal ein Ansatz)
Dann gibt es da noch den Semaphoren Ansatz, der über Prozessgrenzen Betriebsystem Mittel sperren kann (ähnlich dem Mutex).
Wenn das zu kompliziert ist, kann der schreibende Prozess ja auch eine ".lock" Datei schreiben (statt lock vieleicht der original Dateiname mit einem Punkt davor). Der lesende Prozess prüft ob so eine Datei vorhanden ist, und wartet solange bis die Datei gelöscht wurde.
Bei diesem Mechanismus musst Du aber den schreibenden Prozess ändern.
Wenn das nicht geht, dann wäre eine quick-dirty Lösung zu prüfen ob sich die Dateigrösse in einer gewissen Zeit noch ändert. Ist etwas fehleranfällig, aber könnte funktionieren.
Grüße
André
ja das stimmt, das wäre natürlich noch eine Möglichkeit. Was wahrscheinlich am besten ist, eine lock-Datei zu erzeugen und zu warten bis diese wieder gelöscht wurde, um die zu überprüfende Datei auszulesen.
Das wäre dann im Sinne von Qt auch am besten, da es dann wieder systemunabhängig ist.
Was hälst du von der idee, die Datei solange sie übertragen wird eine .lock-Endung zu geben und wenn diese vollständig übertragen wurde, wird die endung wieder entfernt bzw. die datei eben umbenannt?
Das wäre dann im Sinne von Qt auch am besten, da es dann wieder systemunabhängig ist.
Was hälst du von der idee, die Datei solange sie übertragen wird eine .lock-Endung zu geben und wenn diese vollständig übertragen wurde, wird die endung wieder entfernt bzw. die datei eben umbenannt?
Natürlich auch möglich.Was hälst du von der idee, die Datei solange sie übertragen wird eine .lock-Endung zu geben und wenn diese vollständig übertragen wurde, wird die endung wieder entfernt bzw. die datei eben umbenannt?
Hierbei ist natürlich der Hinweis aus dem Thread (http://qtforum.de/forum/viewtopic.php?t=10240) zu berücksichtigen, dass der schreibende Prozess möglicherweise abstürzt, und somit die Datei nicht löschen kann / nicht umbenennen kann.
Grüße
André
PS
Es gibt aber aber Betriebsystem Mittel! Da müsste man mal weiterforschen ...