AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tail Komponente

Ein Thema von nytaiceman · begonnen am 6. Jan 2012 · letzter Beitrag vom 12. Jan 2012
Antwort Antwort
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#1

Tail Komponente

  Alt 6. Jan 2012, 09:18
Hallo zusammen,

Ich habe folgenden kleinen Auftrag zu vergeben:

Beschreibung:
Erstellung einer Delphi Komponente, welche eine einfache "tail" Funktionalität bereitstellt.
--> Permanente Darstellung einer Textdatei (z.B. Logfile eines laufenden Prozesses)

Features:
- Muss Unicode Textfile lesen können
- Muss damit umgehen können, das das Logfile zwischendurch truncated (älteste Einträge werden abgeschnitten) wird
- Muss das Resultat in einem Memo anzeigen
- Muss pausiert werden können
- Muss fortgesetzt werden können (Follow tail)
- Muss den tail Vorgang auch fortsetzen können, wenn die Datei kurzfristig nicht verfügbar ist (z.B. Netzwerkunterbruch oder wenn sie gelöscht wurde)
- Das übergebene Memo scrollt automatisch nach unten (letzte Zeile)
- Die Komponente sollte mit nativem Delphicode erstellt werden (Keine weiteren Fremdkomponenten voraussetzen!)
--> Als Vorbild dient baretail.exe (Nur die Funktion, nicht das Tool!) --> http://www.baremetalsoft.com/baretail/
--> Das Highlighting in der Memo habe ich bereits geschrieben, das betrifft diesen Auftrag nicht.

Spätere Handhabung in Delphi:
- Komponente auf Form ziehen
- Procedure pTailLogFile(sLogFile:String;oMemo:TMemo;bAutostar t:Boolean);
- Procedure pTailStart
- Procedure pTailPause
- Procedure pTailResume --> Entspricht eigentlich "pTailStart"

Auftragsinhalt:
Erstellung der Komponente
Der Sourcecode und die Rechte daran, gehen nach Auftragsende vollständig an mich.
Die Komponente werde ich vollständig (Inkl. Sourcecode) danach der Community von Delphi-Praxis.net kostenlos zur Verfügung stellen.
--> Welche Lizenz? Sie sollte für jeden (kommerziell wie auch privat) verwendet werden dürfen, Verbesserungen sollten aber rückgemeldet werden müssen.

Zeitrahmen:
Bis Ende Januar fertig gestellt.

Bitte meldet euch mit einer kurzen Kostenaufstellung bei mir, danke.
Gruss
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Tail Komponente

  Alt 7. Jan 2012, 11:29
Einige Sourcecode-Links zu Scala- und Java-Implementierungen des Linux Tail Kommandos sind hier zu finden und können eventuell mit wenig Aufwand nach Delphi / Pascal portiert werden:

http://stackoverflow.com/questions/5...x-linux-tail-f

p.s. eventuell könnte noch spezifiziert werden welche Delphi Versionen unterstützt werden sollen.
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Tail Komponente

  Alt 7. Jan 2012, 11:53
Hallo mJustin,

Wärst Du denn interessiert?


@all
Primär muss Delphi 2010 unterstützt werden. Alle weitere Versionen sind von mir nicht verlangt.

Danke für euer Interesse!
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Tail Komponente

  Alt 11. Jan 2012, 14:24
Hallo zusammen,

hat niemand Lust, eine Mark oder zwei zu verdienen?

Keine Ahnung wie gross der Aufwand dazu ist, aber die ersten 100€ stehen auf jeden Fall bereit zur Auszahlung. Wenn es mehr wird, kann man ja darüber reden...
Danke bereits.
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.073 Beiträge
 
Delphi 12 Athens
 
#5

AW: Tail Komponente

  Alt 11. Jan 2012, 16:11
Wenn es noch 1-2 Wochen Zeit hat, dann wäre da bestimmt was machbar.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Tail Komponente

  Alt 12. Jan 2012, 01:16
Gute Nacht,

mit Komponentenentwicklung habe ich noch nichts gemacht - daher nur eine Klasse:

Nachteil an dieser Klasse, der FileStream bleibt die ganze Zeit erhalten,
daher wird es nicht möglich sein, die LogDatei zu löschen oder kürzen.

Habe auf die Schnelle keine Möglichkeit gefunden- die Filegröße auszulesen ohne die Datei zu öffnen.

edit: output ist auch noch nicht synchronisiert.

Grüße
Klaus

Delphi-Quellcode:
unit tail;

interface
uses
  classes;

type
  TTail = class(TThread)
    private
      FOutput: TStrings;
      FLastFilePos: LongWord;
      FLastFileSize: LongWord;
      FFileName: String;
      FThreadWait : Boolean;
      FThreadWaitingState: Boolean;
    protected
      procedure Execute; override;
    public
      procedure pTailLogFile(sLogFile: String;output:TStrings;bAutostart: Boolean = false);
      procedure pTailStart;
      procedure pTailStop;
      procedure pTailPause;
      procedure pTailResume;
      constructor create;
      destructor Destroy; override;

  end;

implementation
uses
  sysUtils;

constructor TTail.create;
begin
  inherited create(true);
end;

destructor TTail.Destroy;
begin
  FThreadWait := true;

  inherited destroy;
end;

procedure TTail.pTailLogFile(sLogFile: string;output: TStrings; bAutostart: Boolean = False);
begin
  FFileName := sLogFile;
  FOutput := output;
  if fileExists(FFileName) then
    begin
      if bAutostart then
        begin
          pTailStart;
        end;
    end
  else
    raise Exception.Create(format('%s not found',[FFileName]));
end;

procedure TTail.pTailStart;
begin
  if self.Suspended then
    begin
      FLastFileSize := 0;
      FLastFilePos := 0;
      FThreadWait := false;
      self.Start;
    end;
end;

procedure TTail.pTailStop;
begin
  self.Terminate;
end;

procedure TTail.pTailPause;
begin
   FThreadWait := true;
end;

procedure TTail.pTailResume;
begin
  FThreadWait := false;
end;

procedure TTail.Execute;
var
  fileStream : TFileStream;
  currentFileSize : LongWord;
  dataBuffer : TMemoryStream;
  s: String;
begin
  while not terminated do
    begin
      if FThreadWait then
        begin
          sleep(50);
          FThreadWaitingState := true;
        end
      else
        begin
          if fileExists(FFileName) then
            begin


              try
                fileStream := TFileStream.Create(FFileName, fmOpenRead or fmShareDenyNone);
              except
                on E:Exception do
                  FOutput.Add(E.Message);
              end;

              try
                FThreadWaitingState := false;
                currentFileSize := fileStream.size;
                if currentFileSize > FLastFileSize then
                  begin

                    FLastFileSize := currentFileSize;
                    fileStream.Seek(FLastFilePos,soFromBeginning);

                    dataBuffer := TMemoryStream.Create;
                    try
                      dataBuffer.CopyFrom(fileStream,currentFileSize - FLastFilePos);
                      FLastFilePos := currentFileSize;
                      dataBuffer.seek(0,soFromBeginning);
                      setString(s,pChar(dataBuffer.memory),dataBuffer.Size div sizeOf(Char));
                      if s <> 'then
                        FOutput.Add(s);
                    finally
                      dataBuffer.Free;
                    end;

                  end
                else
                  if currentFileSize < FLastFileSize then
                    begin
                      FLastFileSize := 0;
                      FLastFilePos := 0;
                    end;
              finally
                fileStream.Free;
              end;
            end
          else
            sleep(100);

        end;
    end;
end;

end.
edit:
*logfile ist von tail nun nicht mehr permanent geöffnet.
*tail läuft weiter wenn die Datei gelöscht wird und anschließen mit gleichem Namen neu erstellt wird.
*tail setzt die Ausgabe der Datei fort, wenn die Datei temporär nicht erreichbar war
- wenn die Datei gekürzt wird - kommt tail mit den Dateipositionen durcheinander, darum wird die ganze Datei nochmals ausgelesen.
Klaus

Geändert von Klaus01 (12. Jan 2012 um 23:37 Uhr)
  Mit Zitat antworten Zitat
nytaiceman

Registriert seit: 15. Dez 2005
Ort: Schweiz, Bern
58 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Tail Komponente

  Alt 12. Jan 2012, 22:18
Hallo und Danke für Deinen Vorschlag.

Das auszulesende Datei darf natürlich nicht permanent geöffnet sein, resp. die ursprüngliche Applikation muss diese nach Bedarf verändern können (Reinschreiben, Löschen, Kopieren etc.)

Aber ich denke Dein Input bringt uns trotzdem weiter.

Sobald ich weitere Infos dazu habe, werde ich diese ebenfalls wieder hier platzieren.

Gruss
Einfach ist nur einfach, wenn Einfach auch einfach ist!
Vermeintlich einfache Workarounds führen irgendwann zu Problemen!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
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