Aus Dateien lesen, die von anderen Anwendungen geöffnet sind
-
Hallo.
Ich möchte in einem Programm eine Log-Datei auslesen, in die eine andere Anwendung zu dieser Zeit aber noch schreibt.
Nun Frage ich mich, wie ich das am besten anstellen soll.Fileopen->auslesen->Fileclose , Fileopen->auslesen->Fileclose, ...
wird wahrscheinlich nicht die ressourcenschonenste Methode sein.Gibt es eine Möglichkeit eine Datei zu öffnen und sobald die Datei verändert wird, eine art OnFileChange() auszulösen, oder in einer Schleife abzufragen, ob sie verändert wurde?
Und was ist die beste Methode herauszufinden, was seid der letzten änderung hineingeschrieben wurde?
Gut wäre es auch wenn ich irgendwie prüfen könnte ob eine Datei von diesem Programm gerade verwendet wird, da dieses Programm immer nach einer gewissen Zeit eine neue Datei erstellt und ich wissen sollte welche die aktuelle ist.
-
Portable Lösungen für diese Probleme wirst du wohl nicht finden (höchstens unter Boost), C++ ist auch nicht unbedingt darauf ausgelegt, die Kommunikation zwischen Programmen zu steuern.
Eine Lösung wäre es, die Datei in beiden Programmen im Shared-Modus geöffnet zu lassen, dann kommen sie sich jedenfalls nicht ins Gehege.
Gibt es eine Möglichkeit eine Datei zu öffnen und sobald die Datei verändert wird, eine art OnFileChange() auszulösen, oder in einer Schleife abzufragen, ob sie verändert wurde?
Und was ist die beste Methode herauszufinden, was seid der letzten änderung hineingeschrieben wurde?
Möglicherweise gibt's auf Systemebene etwas geeignetes (welches System verwendest du?) Wenn sich die Änderungen darauf beschränken, daß die Gegenseite neue Daten ans Ende anhängt (durchaus typisch für eine Log-Datei), bietet die Dateigröße einen Hinweis:
ifstream log("data.log",ios::in|ios::ate); pos_type endp = log.tellg(); do { log.seekg(0,ios::end); if(endp!=log.tellg())//neue Daten verfügbar { log.seekg(endp); //Daten auslesen und verarbeiten bis EOF log.clear(); endp=log.tellg(); } sleep(1000); }while(...);
-
Hast du schon einmal in Erwägung gezogen, Mittel wie Pipes, X-Atome, KIPC oder DCOP (für welches OS entwickelst du die Software?) zu verwenden?