![]() |
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:
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").
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; Nur wie kann ich jetzt vorgeben, wieviele Einträge maximal in der Datei sein sollen? Danke für eure Hilfe! |
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.
|
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 |
Re: maximale Einträge in einer Text-Datei mit TFileStream
So
ich hab den Part jetzt so umgebaut:
Delphi-Quellcode:
so kann ich auch auf die Anzahl der Einträge einwirken
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); |
Re: maximale Einträge in einer Text-Datei mit TFileStream
Hallo Helmi,
Zitat:
Gruß Hawkeye |
Re: maximale Einträge in einer Text-Datei mit TFileStream
Zitat:
ich weiss zwar nicht was passiert mit den nachfolgenden Elementen aber ich denke es muss wohl eher
Delphi-Quellcode:
Damit immer das erste Element gelöscht wird
StringList.Delete(0);
|
Re: maximale Einträge in einer Text-Datei mit TFileStream
Zitat:
Hinweis: For-To-Do Schleifen ermitteln einmalig vor dem ersten Durchlauf die Anfangs- und Endwerte. |
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 |
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); |
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 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz