Textdatei überwachen!?



  • ok, ich schaue auf den letzten zugriff. Aber wie kann ich das so laufen lassen, das es konstant den Wert abfragt? Oder geht das nur über einen Timer?

    Dann, wenn ich sehe, die datei wird verändert, wie kann ich dann am besten die veränderungen anzeigen?

    Ich denke mir das so .... kann man hier Struktugramme zeichnen ? ..na egal ...also

    Programm startet
    Öffne datei
    lese und speichere letzte zeile
    schliesse datei
    zugriffsdatum ist "x"
    prüfe solange "x" = "x" mache nichts
    wenn "x" nicht gleich "x" dann
    öffne datei
    suche letzte Zeile
    gebe allso hinter "letzte Zeile" aus

    sooo ungefähr ......

    müste ja gehen ....das Problem ist dann nur .....es ist nicht echtzeit ...
    naja kleine verögerung müsst ich wohl immer in kauf nehmen....

    gruß Master



  • Klar haste kleine Verzögerungen.....

    aber so kannste nicht feststellen was für ne Veränderung stattgefunden hat. Was bringt dir denn wenn du die letzte Zeil ausliest??
    Sollte jemand eine Veränderung daran machen z.B. ein Zeichen durch ein anderes austauschen findet keine Änderung in der Zeichengröße oder in der Dateigröße statt.

    Ich denke mal bau nen Timer und lass das überprüfen solange es keine anderen Lösungen gibt. Wie du allerdings die Veränderung feststellst gibt wahrscheinlich ein Problem. Denn du musst ja vor der Änderung wissen wie die Datei inhaltlich ausgesehen hat und das dann mit der neuen vergleichen. So eine Art Filecompare bauen. Anders könnte ich es mir im Moment nicht vorstellen.

    *winke*
    Hellsgore



  • sehen sie ....problem erkannt.

    Die elementare aufgabe des Programmes das ich bauen will "muss" ist es aber, eine textdatei zu überprüfen. Meinetwegen eine logdatei. und wenn es veränderungen gibt ... dann sollen diese, möglichst in echtzeit angezteigt werden. Was nicht passiert ist, das Daten die dort nun drin stehen, verändert werden. Es werden nur Daten hinten dran gehängt.

    Zur verdeutlichung: Das Programm soll im Grunde genommen das selbe leisten, wie der tail-befehl in der Unix welt.

    Gruß

    Der Master



  • Mhmm...

    In Echtzeit das ist Kacke. Du könntest einen KeyboardHook darauf legen aber das Problem ist dann das die Datei z.B. mit Notepad geöffnet sein muss sonst kannste den Keylogger nicht benutzen.
    Ich denke mal du musst die Datei lesen, schließen, erneut lesen, schließen etc.
    und jedesmal dabei gucken ob sich die letzte Zeile geändert hat.
    d.h. du musst aufjedenfall die Datei öffnen und da entsteht das Problem wenn sich die Datei schon im Zugriff befindet.....

    Also ich würde mal auf andere Lösungen hoffen 😃

    sorry

    Hellsgore



  • nein, so kann das nicht funktionieren. eben weil ein zugrif von mehreren erfolgen muss. ....hmmm....ich hoffe hier hat noch einer eine andere lösung

    MFG

    Master



  • Nur mal so ne Frage...

    um welchen Dateityp handelt es sich? ist es ne Datenbank?

    Hellsgore



  • nein es handelt sich ausschließlich um Textdateien (.txt, .dat, ect. )



  • Leute, Leute

    FindFirstChangeNotification



  • *g*
    stimmt das gibs auch noch
    aber leider nix dafür er will ja noch lesen was geändert worden ist......

    Hellsgore



  • eben .... und ich muss die geänderten Daten auch noch anzeigen lassen und das am besten noch in Echtzeit...

    sprich.....prog schreibt log.....
    mein Prog zeigt im selben moment die neuen einträge des log´s

    Gruß Master



  • Alles viel zu umständlich.

    Win gibt eine Nachricht rüber wenn die Datei aktualisiert / geändert wurde.
    Also brauchst du nur auf die Nachricht warten und dann reagieren.

    Code Schnispsel und genaueres folgt wenn ich abens zuhause bin.



  • das wäre nicht schlecht. bitte daran denken, das es angezeigt werden muss, welche daten dazu gekommen sind.
    Ich suche mir die anforderungen ja nicht aus.



  • Ich habe auch eine Idee, die fast an Realtime rankommt!
    Es gibt in der WinApi(tut mir leid, ich weiß dass es das MFC-Forum ist) für das NTFS-Dateisystem ein Befehl, der alle Änderungen an Ordnern überwacht. Dazu zählt auch das verändern von Dateien. Entweder du baust dir einen solchen selbst oder du suchst den Apiaufruf.



  • Lutz schrieb:

    Ich habe auch eine Idee, die fast an Realtime rankommt!
    Es gibt in der WinApi(tut mir leid, ich weiß dass es das MFC-Forum ist) für das NTFS-Dateisystem ein Befehl, der alle Änderungen an Ordnern überwacht. Dazu zählt auch das verändern von Dateien. Entweder du baust dir einen solchen selbst oder du suchst den Apiaufruf.

    Schön das du eine Idee hast aber diese habe ich bereits gepostet.

    @mastertango:
    Program startet, öffnet file und speichert den Filezeiger der letzten zeile ab.
    Nun kommt die Überwachung. Sollte hier ein Event ausgelöst werden dann File öffnen,bis zum letzten gespeicherten Filezeiger gehen, alles auslesen bis Fileende und den Zeiger wieder speichern. U.s.w.
    Warum schaust du dir eigentlich nicht den Source von tail an ?



  • So, nu der Code Schnipsel für das Überwachen auf Änderung an der Datei.
    Teil 2 der Aufgabe wie im Beitrag zuvor beschrieben lösen, fertig !

    DWORD dwWaitStatus;
    HANDLE dwChangeHandles;
    
    erg = TRUE;
    
    CStdioFile file;
    CString datei, text;
    
    	// ueberwachen der statusdatei !!
    	dwChangeHandles = FindFirstChangeNotification( m_statusverzeichnis, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE );
    	// FILE_NOTIFY_CHANGE_DIR_NAME
    	// FILE_NOTIFY_CHANGE_LAST_WRITE
    
    	if (dwChangeHandles == INVALID_HANDLE_VALUE) 
    		{
    			ExitProcess (GetLastError());
    		}
    
    	while (erg == TRUE)
    		{
    		// Warten auf benachrictigung, das datei geändert wurde
    		dwWaitStatus = WaitForSingleObject(dwChangeHandles, INFINITE);
    
    		switch (dwWaitStatus)
    			{
    			case WAIT_OBJECT_0:
    				// aktualisierte daten lesen und reagieren !!!!!!!
    
    			AfxMessageBox("datei geändert !!");
    
    }
    
    				// Überwachung auf Nächste Änderung einstellen
    				if (FindNextChangeNotification( dwChangeHandles) == FALSE)
    					ExitProcess(GetLastError());
    
    				AfxMessageBox("datei geändert 2 !!");
    
    					}
    			break;
    
    			default:
    					// ExitProcess(GetLastError());
    				;
    			}
    
    	}
    
    	FindCloseChangeNotification( dwChangeHandles);	// überwachung aus
    



Anmelden zum Antworten