Dateiüberwachung einer "textdatei" .log .txt usw.
-
ein bisschen genauer???
-
Einen Thread mit AfxBeginThread starten (wie dEUs mit CWinThread gemeint hat) und dann in diesem Thread die Textdatei auslesen und vergleichen
-
Halbwegs richtig ist sicherlich:
- gesamte Datei einlese, größe merken.
Dann immer wiederholen:
2) mit GetFileAttributesEx checken, ob die Datei sich geändert hat (ist abhängig von Dateisystem nicht 100% sicher - aber für ein Log file reicht es normalerweise, daß sich die größe geändert hat)- wenn ja, Seek() an die alte Position, rest einlesen, ausgeben
Hier kann man sicher noch dranrumdrehen - z.B.:
FindFirstChangeNotification/FindNextChangeNotification, um "exhte" Änderungsmeldungen zu bekommen
Datei komplett einlesen wenn sich die größe veringert hat
Immer die ersten z.B. 256 Bytes einlesen und merken, und wenn die sich geändert haben, die Datei komplett einlesen.
Das kostet nicht viel Perfomance, und gibt schon einen recht guten Indikator, daß nicht nur angehängt wurde.
-
Rapha schrieb:
Einen Thread mit AfxBeginThread starten (wie dEUs mit CWinThread gemeint hat) und dann in diesem Thread die Textdatei auslesen und vergleichen

du meintest sicher commander oder?
(und nicht dEUs)
-
Die Lösung ist schlecht. naja ...auf jedenfall nicht Annehmbar

1. die Dateinen können bis zu mehreren MB groß sein.Da die ganze Datei einlesen und davon reden das das ding wenig performance verbraucht , passt nicht so ganz.
2. die ersten 200 teichen, byte ..wie auch immer einlesen, bringt auch nichts.... dann kriege ich nie mit wenn sich am ende was endert.
Die3. die letzten Zeichen einlesen ist nur bedingt gut, weil ich ja immer wieder die richtige stelle suchen muss, bevor ich das was dahinter steht auslesen kann.
Ich habe mir überlegt das ich den Inhalt Inhalt sein lasse, sehe wie broß die Datei ist. Meinetwegeen 276 byte. Dann schaue ich auf das Datum des letzten Zugriffs. Wenn sich das ändert, gehe ich an die letzte bekannte stelle "Byte 276" und lese alles bis zum ende aus. Speiche mir die "Byte" welches nun "byte318" ist und so weiter.
Muss nu aber sagen, das ich keine Ahnung habe, wie ich das realisiere, da ich blutiger anfänger bin.

MFG
der Master
-
- Größe - Lösung: Memory Mapped File für Dateizugriff, und Anzeige über virtual list control. Hab ich mal für 100MB große Dateien gemacht - geht wunderbar fix. Ist aber nicht so einfach, deswegen wollt' ich es erstmal außen vor lassen.
Einlesen ist ja nur einmal, bei den späteren gehst du einfach mit Seek() an die alte Position, und liest nur den Rest (dazu)
-
Änderungsdatum etc. sind vom Dateisystem abhängig (NTFS z.B. 2 sec. Auflösung - ich hab damals mit 250 ms gesamplet...).
Wenn das Log file z.B. einen Timestamp in die erste Zeile schreibt, dann ist das Kriterium "Größer geworden/Anfang geändert" wunderbar. Wenn du's "wasserdicht" haben willst, wahrscheinlich File Change Notifications abfangen. -
Stelle Suchen ist wirklich fix mit "Seek".
sehe wie broß die Datei ist. Meinetwegeen 276 byte. Dann schaue ich auf das Datum des letzten Zugriffs. Wenn sich das ändert, gehe ich an die letzte bekannte stelle "Byte 276" und lese alles bis zum ende aus. Speiche mir die "Byte" welches nun "byte318" ist und so weiter.
Ist genau das was ich mit dem Seek meinte

-
C-O-M-M-A-N-D-E-R schrieb:
Rapha schrieb:
Einen Thread mit AfxBeginThread starten (wie dEUs mit CWinThread gemeint hat) und dann in diesem Thread die Textdatei auslesen und vergleichen

du meintest sicher commander oder?
(und nicht dEUs)Ach Mist

-

-
Um das mal zusammenzufassen.
File einlesen und Filepos merken.
In einem Thread oder sonstwie.
HANDLE hFileChanged = FindFirstChangeNotification("c:\\deinfile.txt",TRUE,FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME | FILE_NOTIFY_CHANGE_SIZE); HANDLE hWaitEvents[] = { hFileChanged}; DWORD dwResult = WaitForMultipleObjects(2, hWaitEvents,FALSE,INFINITE);Die Datei soweit ausgeben wie du willst.
Sollte jetzt Windows dir ne Nachricht senden das sich etwas verändert hat:
Wieder den FindFirstChangeNotification aktivieren.
File öffnen, zur letzten Filepos seeken. Einlesen und Filepos merken. Die ändern ausgeben u.s.w.Wenn du wissen willst wie es Profis unter Linux machen dann schaue dir das Programm tail an. Gibts im Netz mit Source.
-
@UT: fehlt noch ein Handle, oder eine 1 zuviel
-
Man soll ja auch Code nicht einfach übernehmen sondern schauen was er macht und ihn an seine Bedürfnisse anpassen
-
