Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi maximale Einträge in einer Text-Datei mit TFileStream (https://www.delphipraxis.net/88834-maximale-eintraege-einer-text-datei-mit-tfilestream.html)

Helmi 21. Mär 2007 19:17


maximale Einträge in einer Text-Datei mit TFileStream
 
Hallo,

ich brauch mal Hilfe - ich steh auf dem Schlauch

Also ich hab eine Komponente geschrieben, die Logfiles schreibt.
funktioniert auch.

Nun möchte ich aber, dass ich vorgeben kann, wieviele Einträge in der Log vorhanden sein dürfen. Sollte ein neuer Eintrag hinzukommen, dann soll der älterste rausfallen.

Ich mach das im Code so:
Delphi-Quellcode:
  try
    FileStream := TFileStream.Create(LogFile, fmOpenReadWrite);

    with FileStream do
      begin
        //Fehler-Text
        S := ErrorText;
        S := StringReplace(S, '<date>', DateToStr(date), [rfReplaceAll]);
        S := StringReplace(S, '<time>', TimeToStr(time), [rfReplaceAll]);
        S := S + #13#10;

        //
        If FAddAtEnd then
          //Am Ende der Datei schreiben (FileStream-Position = FileStream-Größe)
          Position := Size
        else
          begin
            //Am Anfang der Datei schreiben

            //Vorhandene Datei auslesen
            Stream_Laenge := Size;

            If Stream_Laenge > 0 then
              begin
                SetLength(Buffer, Stream_Laenge);
                ReadBuffer(Buffer[1], Stream_Laenge);
              end;

            //Positionen setzen
            Size         := 0;
            Position     := 0;

            //Text zusammenfügen
            S            := S + Buffer;
          end;

        //In die vorhandene Datei schreiben
        WriteBuffer(S[1], Length(S));
      end;
  finally
    //FileStream freigeben und löschen
    FreeAndNil(FileStream);
  end;
Wie man sieht, kann ich entweder am Anfang der Datei oder am Ende der Datei einen Eintrag hinzufügen (abhängig von der Property "FAddAtEnd").

Nur wie kann ich jetzt vorgeben, wieviele Einträge maximal in der Datei sein sollen?

Danke für eure Hilfe!

Muetze1 21. Mär 2007 19:24

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
Das einfachste wäre es doch einfach eine Maximalgrösse in (kilo)Bytes festzulegen. Dann sparst du dir das gesamte Gewusel um die Zeilenanzahl rauszubekommen.

Helmi 21. Mär 2007 19:42

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
mmh

ich hab grad mit einer StringList rumprobiert.
Um die Anzahl der Zeilen rauszubekommen könnt ich den FileStream in eine StringList einlesen
und so wüsst ich wieviele Einträge drin sind

Helmi 21. Mär 2007 20:56

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
So

ich hab den Part jetzt so umgebaut:
Delphi-Quellcode:
  FileStream := TFileStream.Create(LogFile, fmOpenReadWrite);
  StringList := TStringList.Create;

  try
    //Fehler-Text
    S := ErrorText;
    S := StringReplace(S, '<date>', DateToStr(date), [rfReplaceAll]);
    S := StringReplace(S, '<time>', TimeToStr(time), [rfReplaceAll]);

    //FileStream in Stringlist laden
    StringList.LoadFromStream(FileStream);

    If FAddAtEnd then
      begin
        //Ende
        StringList.Add(S);

        //Alle Einträge am Anfang der Liste löschen
        If FLoopCount > 0 then
          If StringList.Count > FLoopCount then
            for i := 0 to Pred(StringList.Count - FLoopCount) do
              StringList.Delete(i);
      end
    else
      begin
        //Anfang
        StringList.Insert(0, S);


        //Alle Einträge am Ende der Liste löschen
        If FLoopCount > 0 then
          If StringList.Count > FLoopCount then
            for i := Pred(StringList.Count) downto FLoopCount do
              StringList.Delete(i);
      end;

    //FileStream-Größe auf 0 setzen und dadurch löschen
    FileStream.Size := 0;

    //StringList in FileStream speichern
    StringList.SaveToStream(FileStream);
so kann ich auch auf die Anzahl der Einträge einwirken

Hawkeye219 21. Mär 2007 21:08

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
Hallo Helmi,

Zitat:

Delphi-Quellcode:
for i := 0 to Pred(StringList.Count - FLoopCount) do
  StringList.Delete(i);

Was passiert wohl mit den nachfolgenden Elementen, nachdem du das erste Element gelöscht hast?

Gruß Hawkeye

Helmi 21. Mär 2007 21:12

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
Zitat:

Zitat von Hawkeye219
Hallo Helmi,

Zitat:

Delphi-Quellcode:
for i := 0 to Pred(StringList.Count - FLoopCount) do
  StringList.Delete(i);

Was passiert wohl mit den nachfolgenden Elementen, nachdem du das erste Element gelöscht hast?

Gruß Hawkeye

mmh

ich weiss zwar nicht was passiert mit den nachfolgenden Elementen
aber ich denke es muss wohl eher
Delphi-Quellcode:
StringList.Delete(0);
Damit immer das erste Element gelöscht wird

Muetze1 23. Mär 2007 01:00

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
Zitat:

Zitat von Helmi
ich weiss zwar nicht was passiert mit den nachfolgenden Elementen
aber ich denke es muss wohl eher
Delphi-Quellcode:
StringList.Delete(0);
Damit immer das erste Element gelöscht wird

Tja, das man schlecht, wenn du das nicht weisst. Das Problem auf das Hawkeye219 dich hinweisen will, besteht auch weiterhin.

Hinweis: For-To-Do Schleifen ermitteln einmalig vor dem ersten Durchlauf die Anfangs- und Endwerte.

Helmi 23. Mär 2007 07:29

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
mmh

mir war das schon klar, dass eine for-to-do-Schleife die Durchläufe am Anfang ermittelt - nur, mein Code hat funktioniert, deswegen hab ich auch keinen Fehler bemerkt.

Ich werds aber gegen eine for-downto-do-Schleife tauschen.

Trotzdem Danke für den Hinweis

Helmi 23. Mär 2007 11:03

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
so, habs jetzt so geändert:

Delphi-Quellcode:
for i := Pred(StringList.Count - FLoopCount) downto 0 do
  StringList.Delete(i);

himitsu 23. Mär 2007 16:44

Re: maximale Einträge in einer Text-Datei mit TFileStream
 
Ich hätte da noch dieses anzubieten.

Erstens ist es ja egal in welcher Reinfolge gelöscht wird ... weg muß es so, oder so.

Und dann kann man sich auch die Berechnung des Index des zu löschnden Eintrags ersparen, wenn man betrachtet daß alle zu löschenden Einträge an 2 bestimmten Punkten auf jeden Fall vorbeikommen müssen. :angel:
Delphi-Quellcode:
//Alle Einträge am Anfang der Liste löschen
If FLoopCount > 0 Then
  While StringList.Count > FLoopCount do
    StringList.Delete(0);


//Alle Einträge am Ende der Liste löschen
If FLoopCount > 0 Then
  While StringList.Count > FLoopCount do
    StringList.Delete(FLoopCount);


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 Uhr.
Seite 1 von 2  1 2      

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