Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tail Funktionalität (https://www.delphipraxis.net/140625-tail-funktionalitaet.html)

gsh 22. Sep 2009 13:22


Tail Funktionalität
 
Hallo Leute,

Es kennen doch von euch sicher viele die Programme "Tail for Win32", "WinTail" oder unter Linux "tail". Genau diese Funktionalität will ich in meinem Programm auch implementieren.

Falls jemand die Programme nicht kennt: Diese Programme öffnen eine Datei und zeigen automatisch neue Zeilen an die nach dem Öffnen in die Datei geschrieben wurde. Am besten vorstellbar bei Log Dateien: Wenn eine neue Zeile vom Programm geloggt wird dann kann man diese sofort sehen und muss nicht die Log-Datei neu öffnen.

Meine Frage ist jetzt wie ich so etwas am besten realiesieren könnte. Jedesmal mit LoadFromFile die Datei neu laden und dann auf Änderungen überprüfen ist glaub ich keine gute Lösung.

mleyen 22. Sep 2009 13:28

Re: Tail Funktionalität
 
Du könntest in regelmäßigen Abständen die Werte der Dateigröße und 'Zuletzt geändert am' auf Änderung prüfen.
Erst wenn sich diese Werte verändert haben wird die Datei neu geladen und auf den Inhalt geprüft.

Es gab aber auch mal eine Komponente namens "FileWatcher", ich glaub hier aus der DP. Evtl. könnte man da mal nachschauen, wie die die Änderungen feststellt.

Klaus01 22. Sep 2009 13:32

Re: Tail Funktionalität
 
.. hier ein ähnlicher Ansatz:

Zitat:

AndersonCarli:
You may save last file size and then read from that pos.
Try this: (not compiled)
Delphi-Quellcode:
function Tail(FileName:string; Position:Integer):string;
var
  S: TStream;
  C: Char;
  L: Integer;
begin
  S := TFileStream.Create(FileName, fmOpenRead ,fmShareDenyNone);
  try
    S.Seek(Position, soBeginning);
    L := S.Size-Position;
    SetLength(Result, L);
    S.Read(Result[1], L);
  finally
    S.Free;
  end;
end;

Quelle

Grüße
Klaus

mkinzler 22. Sep 2009 13:32

Re: Tail Funktionalität
 
Sollte mt Hilfe eines FileStreams funktionieren.

Btw. Tail zeigt den Schluss ( letzte n-Zeilen an)

Assertor 22. Sep 2009 13:34

Re: Tail Funktionalität
 
Hi,

Stichwort: FindFirstChangeNotification, z.B. implementiert in ATFileNotification (Komponente).

Gruß Assertor

gsh 22. Sep 2009 13:50

Re: Tail Funktionalität
 
Also ich fass es mal kurz zusammen:
* Sagen wir mal jede Sekunde die Dateigröße überprüfen.
* Wenn die Dateigröße kleiner geworden ist (sollte eigentlich nicht vorkommen) -> Datei komplett neu einlesen
* Wenn die Dateigröße größer geworden ist dann über den Filestream die letzten Änderungen einlesen (Post #3)

Dies klingt für mich mal ganz gut (Hätte ich eigentlich auch selbst drauf kommen können :oops: ). Die Methode sollte dann sogar über ftp funktionieren :mrgreen: .

Zitat:

Zitat von Assertor
Stichwort: FindFirstChangeNotification, z.B. implementiert in ATFileNotification (Komponente).

Ist wahrscheinlich die Ressourcen schonenste Variante aber es geht wahrscheinlich nicht über eine Windows Freigabe (und ganz sicher nicht über ftp) oder? (Hab vergessen zu schreiben das das auch wichtig ist.)

gsh 22. Sep 2009 14:01

Re: Tail Funktionalität
 
So hab das jetzt kurz probiert und bin gleich mal auf ein Problem gestoßen:
Im Projekt Project1.exe ist eine Exception der Klasse EFOpenError mit der Meldung 'Datei C:\Testlogdatei.log kann nicht geöffnet werden. Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird' aufgetreten.

Die Log-Datei wird vom Server exklusiv exklusiv geöffnet (kann ich nicht ändern). Deswegen kann mein Programm darauf nicht zugreifen. Der Witz ist aber das z.b. WinTail es schafft die Datei trotzdem auszulesen. Wie macht WinTail das?

himitsu 22. Sep 2009 14:46

Re: Tail Funktionalität
 
Es gibt hier schon ein paar Threads zu diesem Thema "Auf Dateien zugreifen, welche geöffnet sind"
z.B. http://www.delphipraxis.net/internal...t.php?t=141044

In irgendeinem hatte ich mal eine Demo gepostet, welche sobald sie erstmal Zugriff auf die Datei (vie Filehandle und mit den geltenden Zugriffs- und Sharingrechten erhalten hat, diesen immer behält und danach andere Programm normal drauf zugreifen können, da dann an den Sharingrechten vorbeigelesen wird :stupid:
(ich finde nur den schon ein paar Jahre alten Thread nimmer, aber da ging's darum zu erkennen ob eine Datei vor irgendeinem Programm geöffnet ist),
aber wenn ich mich nicht irre, dann würde dieser Weg dir wohl nicht viel helfen, da (glaube ich zumindestens grade) die nur der Bereich zugreifbar ist, welcher schon existierte und nichts aus Dateivergrößerungen ... müßte ich irgendwann mal schauen, ob ich das so richtig in erinnerung hab.

PS: Die Zugriffsprobleme, welche du beim Lesen hast, hat das andere Programm auch,
also wenn du grad dabei bist die Datei auszulesen und das andere Programm da grad was reinschreiben will ... *peng* und, wenn du Pech hast, das andere Programm macht sonstwas :stupid:

Morphie 22. Sep 2009 16:33

Re: Tail Funktionalität
 
Du könntest einfach die Datei temporär kopieren, dann sollte das doch eigentlich klappen, oder?
müsstest du beim FTP ja sowieso, oder?

gsh 22. Sep 2009 17:16

Re: Tail Funktionalität
 
Zitat:

Zitat von himitsu
Es gibt hier schon ein paar Threads zu diesem Thema "Auf Dateien zugreifen, welche geöffnet sind"
z.B. http://www.delphipraxis.net/internal...t.php?t=141044

Bringt mir nichts da es ganz wichtig ist das z.b. so eine datei: \\entfernterpc\freigabe\datei.log auch geöffnet werden kann. Da der Service der auf die Datei zugreift somit nicht auf dem gleichen System ist ...

Zitat:

Zitat von himitsu
In irgendeinem hatte ich mal eine Demo gepostet, welche sobald sie erstmal Zugriff auf die Datei (vie Filehandle und mit den geltenden Zugriffs- und Sharingrechten erhalten hat, diesen immer behält und danach andere Programm normal drauf zugreifen können, da dann an den Sharingrechten vorbeigelesen wird :stupid:
(ich finde nur den schon ein paar Jahre alten Thread nimmer, aber da ging's darum zu erkennen ob eine Datei vor irgendeinem Programm geöffnet ist),
aber wenn ich mich nicht irre, dann würde dieser Weg dir wohl nicht viel helfen, da (glaube ich zumindestens grade) die nur der Bereich zugreifbar ist, welcher schon existierte und nichts aus Dateivergrößerungen ... müßte ich irgendwann mal schauen, ob ich das so richtig in erinnerung hab.

Der Service greift immer als erstes und andauerend auf die Datei zu. Somit geht diese Lösung leider auch nicht.

Zitat:

Zitat von himitsu
PS: Die Zugriffsprobleme, welche du beim Lesen hast, hat das andere Programm auch,
also wenn du grad dabei bist die Datei auszulesen und das andere Programm da grad was reinschreiben will ... *peng* und, wenn du Pech hast, das andere Programm macht sonstwas :stupid:

ich dachte Filesystem Zugriffe werden durch Windows Threadsafe gemacht. :gruebel:

Zitat:

Zitat von Morphie
Du könntest einfach die Datei temporär kopieren, dann sollte das doch eigentlich klappen, oder?
müsstest du beim FTP ja sowieso, oder?

Davon abgesehen das ich auch nicht auf die Datei zugreifen kann um sie kopieren zu können, ist dies bei teilweiße großen Logs über das Netzwerk eine sehr schlechte Lösung.

Das mit dem FTP ist sehr optional und war nur mal eine kleine Idee von mir. Also kann dies erstmal nach hinten gestellt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz