Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Textdatei-Einträge rückwärts speichern (https://www.delphipraxis.net/123454-textdatei-eintraege-rueckwaerts-speichern.html)

Guido Eisenbeis 2. Nov 2008 12:01


Textdatei-Einträge rückwärts speichern
 
OK, der Titel ist nicht sehr aufschlussreich. :-) Deshalb hier die ausführlichere Erklärung:

Bei meinen täglichen Daten-Backups lasse ich am Schluss Informationen in ein Logfile schreiben: Startzeit, Endzeit, Dauer. Dabei wird der jeweilige Eintrag jeden Tag an die vorhandenen angehängt.

Nun ist ja klar, dass dabei der neueste Eintrag ganz am Schluss steht. Jetzt hätte ich halt gerne, dass die Reihenfolge umgekehrt ist und der neueste Eintrag ganz am Anfang des Logfiles steht.

Mein bisheriger Ansatz ist, dass ich das vorhandene Logfile umbenenne in Logfile.txt.bak, ein neues Logfile.txt erstelle, dort den aktuellen Tages-Eintrag speichere und danach die Einträge aus dem bak hinzufüge.

Nachteil dabei ist allerdings, dass ab einer bestimmten Größe des Logfiles das schon heftig lange dauern kann!?

Was meint ihr dazu? Kann man das eleganter lösen?

Guido.

mkinzler 2. Nov 2008 12:04

Re: Textdatei-Einträge rückwärts speichern
 
Beim Schreiben nicht, aber beim Anzeigen der Logdatei

thkerkmann 2. Nov 2008 12:06

Re: Textdatei-Einträge rückwärts speichern
 
Hi

ja kann man :-)

Lass doch einfach für jeden Tag ein eigenes Logfile erstellen:

Bsp.
Delphi-Quellcode:

  LogName := 'Logfile-'+FormatDateTime('yyyy-mm-dd', Date) + '.txt';
dann ist es schön klein, sortiert sich im Explorer gut, und du kannst alte logs bei Bedarf löschen.

Gruss

Union 2. Nov 2008 12:07

Re: Textdatei-Einträge rückwärts speichern
 
Zitat:

Zitat von Guido Eisenbeis
Was meint ihr dazu? Kann man das eleganter lösen?

Ja, ans Ende anhängen :)
Ansonsten in etwa:
Delphi-Quellcode:
var
   LogLines : TStringList;
begin
   LogLines := TStringList.Create;
   try
      LogLines.LoadFromFile('LogFile.txt');
      LogLines.Insert(0, 'Eintrag an erster Stelle');
      LogLines.SaveToFile('LogFile.txt');
   finally
      LogLines.Free;
   end;
end;
Natürlich ist das weder performant noch ressourcenschonend, aber übersichtlich.

DeddyH 2. Nov 2008 12:19

Re: Textdatei-Einträge rückwärts speichern
 
Mit Streams ginge das auch:
Delphi-Quellcode:
procedure AddFirstLine(const sLine: string; const sFilename: TFilename);
var sStream: TStringStream;
    fStream: TFileStream;
begin
  fStream := TFileStream.Create(sFilename,fmOpenReadWrite);
  try
    sStream := TStringStream.Create(sLine);
    try
      sStream.WriteString(sLine + sLineBreak);
      sStream.CopyFrom(fStream,0);
      fStream.Position := 0;
      fStream.CopyFrom(sStream,0);
    finally
      sStream.Free;
    end;
  finally
    fStream.Free;
  end;
end;
Ist aber auch nicht besonders ressourcenschonend, fürchte ich.

[edit] Ist das Syntax-Highlighting neuderdings abgeschaltet? :stupid: [/edit]

Guido Eisenbeis 2. Nov 2008 18:35

Re: Textdatei-Einträge rückwärts speichern
 
Zitat:

Zitat von mkinzler
Beim Schreiben nicht, aber beim Anzeigen der Logdatei

Hatte ich auch schon überlegt, konnte aber noch nicht wirklich den Aufwand zum Nutzen einschätzen.

Zitat:

Zitat von thkerkmann
Lass doch einfach für jeden Tag ein eigenes Logfile erstellen:
... dann ist es schön klein, sortiert sich im Explorer gut, und du kannst alte logs bei Bedarf löschen.

Das würde jede Menge Durcheinander und nun nicht wirklich einen Vorteil bringen. Mein Logfile umfast nun ca 360 Einträge von etwa einem Jahr. Das würden dann 360 Logfiles werden. Löschen will ich eigentlich nicht, ich find's gut, einen "Jahresüberblick" zu haben. In meinem einzelnen Logfile ergibt das gerade mal eine Größe von 28 KB.

Beim Sortieren müsse ich dann im Explorer die Spaltenüberschrift anklicken, was in etwa dem derzeitigen Aufwand entspricht, bei dem ich im Logfile die Tastenkombi Strg+Ende drücke. Also nicht wirklich ein Vorteil. Dennoch eine interessante Idee!


@Union und DeddyH
Die Ideen mit Stringlist und Stream sind vom Prinzip her genauso wie meine Idee mit den zwei Dateien, aber tatsächlich eleganter! :hello:

Die werde ich ins Auge fassen. Klingt sehr gut!

Was das Performate angeht, bei einer Logfile-Größe von knapp 30 KB nach einem Jahr denke ich, dass die Performance vertretbar ist. Werd ich mal ausprobieren. Winziger Wehrmutstropfen: Die Steuerung der Backups und das Schreiben des Logfiles wird nicht mit Delphi-Code erledigt, sondern mit AutoIt-Code. Mal sehen, was da möglich ist.

Ansonsten vielen Dank an alle! :-D


PS @Union:

Ganz anderes Thema: Ich habe einen Code von dir übernommen und ein wenig aufgepeppt und in einer Unit gekapselt. Da muss ich mal dran denken, den der Community zur Verfügung zu stellen. :wink: An dieser Stelle danke für den Code!

Guido.

Guido Eisenbeis 7. Nov 2008 23:59

Re: Textdatei-Einträge rückwärts speichern
 
Ok, habs nun in AutoIt umgesetzt (nur so, als Spielerei). :-)

Das Prinzip von oben habe ich benutzt: Komplettes Logfile einlesen, Inhalt löschen, neuen Eintrag schreiben und zum Schluss den kompletten alten Inhalt hinzufügen.

Dank an alle Mitwirkenden!

Guido.

aladin60 8. Nov 2008 18:33

Re: Textdatei-Einträge rückwärts speichern
 
Logfile in Stringlist einlesen, mit Insert an Position 0 Zeile mit dem Eintrag einfügen und wieder in Datei speichern.

Bernd.

DeddyH 8. Nov 2008 18:34

Re: Textdatei-Einträge rückwärts speichern
 
Das stand schon in #4 ;)

aladin60 8. Nov 2008 18:42

Re: Textdatei-Einträge rückwärts speichern
 
Sorry, nur kurz überlesen...

Bernd.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02: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