Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zeilenanzahl bei name.log Datei begrenzen (https://www.delphipraxis.net/137265-zeilenanzahl-bei-name-log-datei-begrenzen.html)

aaaaaaaaaa_10 17. Jul 2009 10:15


Zeilenanzahl bei name.log Datei begrenzen
 
Hallo, ich habe eine Datei erstellt. Will jetzt dass da aber nur max 1000 Zeilen rein dürfen.. werden es mehr sollen die ersten zeilen wieder gelöscht werden und die neuen hintenrangehängt.. Wie mache ich das am besten?

pertzschc 17. Jul 2009 10:17

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Wenn es eine Zeilenbasierte Datei mit Stringinhalten ist, könntest Du StringList verwenden.
Einlesen, Count prüfen, jeweils erste Zeilen [0,1,..] löschen bis Count <=1000, dann wieder in die Datei speichern.

Gruß,
Christoph

hoika 17. Jul 2009 10:18

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Hallo,

am einfachsten lädst du die Datei (StringList.LoadFromfile),
löscht die Anzahl der Zeilen, aus der Liste,
die neu hinzukommen sollen

for i:= 1 to 10 do
begin
StringList.Delete(0);
end;

und fügst die neuen Zeilen hinzu.
StringList.Add()
und dann SavetoFile

Der obige Code geht davon aus dass schon 1.000 Zeilen dirnsind,
muss also etwas angepasst werden.

Aber die Vorgehensweise sollte klar sein,
ein bissel sollst du ja auch machen ;)


Heiko

aaaaaaaaaa_10 17. Jul 2009 10:20

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Es werden aber zur Laufzeit neue Zeilen hineingeschrieben...Das heißt, ich müsste ständig prüfen, ob die Zeilenanzahl schon erreicht ist... Oder? Mit nem Timer oder wie?

Klaus01 17. Jul 2009 10:28

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Hallo,

ich würde das Problem etwas anders angehen.
Ist die die Datei "voll", hat also 1000 Zeilen erreicht
wird sie umbenannt in datei_01.txt.
Eine neue Datei.txt wird angelegt.
Und das Spiel beginnt von vorne.
Du mußt Dir dann nur noch überlegen
wieviele Dateien Du vorhalten willst.

Grüße
Klaus

aaaaaaaaaa_10 17. Jul 2009 10:29

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ich möchte aber nur eine Datei. Wozu mehrere?

Klaus01 17. Jul 2009 10:37

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Zitat:

Zitat von aaaaaaaaaa_10
Ich möchte aber nur eine Datei. Wozu mehrere?

Das ist eine Frage der Philosophie.

Grüße
Klaus

IIIMADDINIII 17. Jul 2009 10:42

Re: Zeilenanzahl bei name.log Datei begrenzen
 
also,
ich würd es so machen wie schon oben gesagt immer wenn diu eine zeile in deimen programm schreibst löschst du gleichzeitig eine. und am anfang erstellst du eine datei mit 1000 lehren zeilen.
einfacher get es eben nicht

Satty67 17. Jul 2009 10:48

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Zitat:

Zitat von aaaaaaaaaa_10
Es werden aber zur Laufzeit neue Zeilen hineingeschrieben...Das heißt, ich müsste ständig prüfen, ob die Zeilenanzahl schon erreicht ist... Oder? Mit nem Timer oder wie?

Du prüfst nicht mit einem Timer, sondern die Funktion, die schreibt, prüft das.

Also Zeile schreiben -> 1000 Zeilen erreicht?

Ja, dann Zeilen löschen
Nein, dann Funktion beenden

Sharky 17. Jul 2009 10:53

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ich glaube fast das hier mal wieder eine entscheidende Information fehlt!
Wie kommen die Daten denn in die Datei? Von Deiner Anwendung oder, wie ich vermute, von einer anderen Anwendung?

Im zweiten Fall sehe ich keine möglichkeit sicherzustellen das in der Datei nur 1000 Zeilen stehen.

himitsu 17. Jul 2009 10:58

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Wenn die Delphiversion Class-Helper unterstützt, dann ginge sowas, für alle Nachfahren von TStrings:
Delphi-Quellcode:
Type TStringsAddHelper = Class Helper for TStrings
    Function TruncedAdd(Const S: String; MaxLines: Integer): Integer;
  End;

Function TStringsAddHelper.TruncedAdd(Const S: String; MaxLines: Integer): Integer;
  Begin
    If MaxLines > 0 Then
      While Count >= MaxLines do Delete(0);
    Result := Add(S);
  End;
z.B. maximal 1000 Zeilen:
Delphi-Quellcode:
SL := TStringList.Create;
SL.TruncedAdd('string', 1000);

// oder
Memo1.Lines.TruncedAdd('string', 1000);

aaaaaaaaaa_10 20. Jul 2009 13:51

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Also LogFile ist vorgegeben als TLogFile. Da hab ich auch nicht die Wahl daraus ne StringList zu machen.
Wie lösche ich also eine Zeile aus nem TLogFile?

DeddyH 20. Jul 2009 13:54

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Was ist denn TLogFile für eine Klasse? Mein D2007 kennt die zummindest nicht.

aaaaaaaaaa_10 20. Jul 2009 13:55

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Was von meinem Vorgänger

Delphi-Quellcode:
type
  TLogFile = class(TObject)
  private
     FFileName: String;
    FLogSize: Integer;
    FAppLog: Boolean;
  public
      constructor Create(FileName: string; LogSize: integer; AppLog: boolean);
    destructor Destroy; override;
      procedure AddLine(Line: string);
      property FileName: string read FFileName;
  end;

Aphton 20. Jul 2009 13:57

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Wo werden die Lines denn gespeichert ? Also ich kann kein Array / keine Liste / oder sonstiges im Private Bereich sehen...

MfG

DeddyH 20. Jul 2009 13:58

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Das sind aber etwas zu wenig Infos, als dass man nun einen gescheiten Rat geben könnte. Vermutlich werden in der Klasse die Strings ja auch in einer Liste verwaltet, in dem Stück Code ist davon aber nichts zu sehen.

aaaaaaaaaa_10 20. Jul 2009 14:00

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Delphi-Quellcode:
constructor TLogFile.Create(FileName: string; LogSize: integer;
  AppLog: boolean);
begin
   FFileName := FileName;
  FLogSize := LogSize;
  FAppLog := AppLog;
end;

procedure TLogFile.AddLine(Line: string);
var
   F: TextFile;
  Zeile: String;
begin
   FileMode := fmOpenReadWrite;
   AssignFile(F, FFileName);
  try
      Append(F);
  except
     Rewrite(F);
  end;
  Zeile := FormatDateTime('c.zzz - ', Now)+Line;
  WriteLn(F, Zeile);
  CloseFile(F);
end;

DeddyH 20. Jul 2009 14:03

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ahja, es wird also direkt in die Datei geschrieben. Aber Du könntest die AddLine-Methode ja dahingehend ändern, dass diese eine TStringlist verwendet.

aaaaaaaaaa_10 20. Jul 2009 14:03

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Und dann? Hab ich überall Fehlermeldungen, weil die Uni Logfile.pas von vielen anderen Units benutzt wird..

pertzschc 20. Jul 2009 14:05

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Zitat:

Zitat von aaaaaaaaaa_10
Und dann?

Zitat:

Zitat von pertzschc
Wenn es eine Zeilenbasierte Datei mit Stringinhalten ist, könntest Du StringList verwenden.
Einlesen, Count prüfen, jeweils erste Zeilen [0,1,..] löschen bis Count <=1000, dann wieder in die Datei speichern.

Du liest nicht so richtig, was wir Dir schreiben - oder?

Gruß,
Christoph

DeddyH 20. Jul 2009 14:06

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Wieso Fehlermeldungen? An der Methodensignatur ändert sich ja nichts.

aaaaaaaaaa_10 20. Jul 2009 14:10

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ich steh voll aufm Schlauch. Weiß net so richtig was ihr meint.. :pale:

DeddyH 20. Jul 2009 14:15

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Es kann den anderen Programmen doch Wurscht sein, wie die Klasse intern arbeitet. Solange die Methoden aufrufkompatibel bleiben, sollte es auch keine Fehlermeldungen geben.

Luckie 20. Jul 2009 14:15

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Delphi-Quellcode:
procedure TLogFile.AddLine(Line: string);
var
   F: TextFile;
  Zeile: String;
begin
   FileMode := fmOpenReadWrite;
   AssignFile(F, FFileName);
  try
      Append(F);
  except
     Rewrite(F);
  end;
  Zeile := FormatDateTime('c.zzz - ', Now)+Line;
  WriteLn(F, Zeile);
  CloseFile(F);
end;
Daraus sollst du machen:
Delphi-Quellcode:
procedure TLogFile.AddLine(Line: string);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  ...;
  ...;
  ...;
end;
Die anderen programme, die die Klasse benutzen bekommen doch gar nicht mit, dass sich innerhalb der Methode was am Quellcode geändert hat.

pertzschc 20. Jul 2009 14:16

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Delphi-Quellcode:
procedure TLogFile.AddLine(Line: string);
var
  LogFileList : TStringList;
  Zeile: String;
begin
  LogFileList := TStringList.Create;
  try
    LogFileList.LoadFromFile(FFileName);
    // hier eine while-schleife, solange LogFileList.Count > 999
    // innerhalb der schleife immer LogFileList.Delete(0); damit wird oberstes zeile gelöscht.
    // danach hat das file im speicher 999 zeilen und die 1000. zeile kann hinzugefügt werden
    Zeile := FormatDateTime('c.zzz - ', Now)+Line;
    LogFileList.Append(Zeile);
    LogFileList.SaveToFile(FFileName);
  finally
    LogFileList.Free;
  end;
end;

aaaaaaaaaa_10 20. Jul 2009 14:27

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Das Problem ist auf das TLogFile greifen verschiedene Programm zu, das eine darf 1000 zeilen haben und das andere nur 300.

DeddyH 20. Jul 2009 14:27

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Dann führ doch eine Property "MaxLines" oder so ein.

Aphton 20. Jul 2009 14:30

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ich bin mal so großzügig ...

Delphi-Quellcode:
type
  TLogFile = class
  private
  // ...
    FMaxLines: Cardinal; // diese variable dann irgendwo im Code setzen - bsp 1000 ... in deinem Fall ...
  public
  // ...
    property MaxLines: Cardinal Read FMaxLines Write FMaxLines;
  end;


procedure TLogFile.AddLine( Line: String );
begin
  with TStringList.Create do
  begin
    try
      LoadFromFile( FFileName );
      while Count > (MaxLines-1) do
        Delete(0);
      Add( FormatDateTime('c.zzz - ', Now)+Line );
      SaveToFile( FFileName );
    finally
      Free;
    end;
  end;
end;

aaaaaaaaaa_10 20. Jul 2009 14:41

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Setze ich sie in meinem Programm, das nur 1000 zeilen haben soll auf
Delphi-Quellcode:
logFile.FMaxLines := 1000;
Sagt er mir undefinierter Bezeichner FMaxLines

Irgendwie klappt heute gar nix.. Zum glück habt ihr geduld

hoika 20. Jul 2009 14:44

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Hallo,

public ist MaxLines, nicht FMaxLines.


Heiko

aaaaaaaaaa_10 20. Jul 2009 14:45

Re: Zeilenanzahl bei name.log Datei begrenzen
 
geht aber auch net

hoika 20. Jul 2009 14:50

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Hallo

1. geht nicht, ist keine Fehlermeldung
2. wenn man dir schon fast alles hier hinschreibt,
wäre es schön, wenn du auch mal den Debugger anwerfen würdest
und nicht auf eine komplette Lösung warten würdest.


Heiko

aaaaaaaaaa_10 20. Jul 2009 14:51

Re: Zeilenanzahl bei name.log Datei begrenzen
 
dieselbe fehlermeldung wie bei FMaxLines

Aphton 20. Jul 2009 14:53

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Weißt du was, vergiss das ganze und lern erst einmal die Delphi-Syntax!
Ist wirklich nur gut gemeint, denn so kommst du nicht weit. Und Grundlegende Sachen zu vermitteln ist nervig!

MfG

pertzschc 20. Jul 2009 14:54

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Zitat:

Zitat von aaaaaaaaaa_10
Delphi-Quellcode:
constructor TLogFile.Create(FileName: string; LogSize: integer;
  AppLog: boolean);
begin
   FFileName := FileName;
  FLogSize := LogSize;
  FAppLog := AppLog;
end;

Schau mal selber, Du hast uns hier den Konstruktor von Deinem TLogFile gepostet. da kannst Du doch eine LogSize mitgeben, vielleicht sind das ja Deine "1000" Zeilen?
Gruß, Christoph

aaaaaaaaaa_10 22. Jul 2009 09:19

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Also, ich habe es jetzt in Ruhe durchgearbeitet und es geht fast.

Delphi-Quellcode:
procedure TLogFile.AddLine(Line: string);
var
  LogFileList : TStringList;
  Zeile: String;
begin
  LogFileList := TStringList.Create;
  try
    [color=#ff001f]LogFileList.LoadFromFile(FFileName);[/color]
    while LogFileList.Count > (MaxLines-1) do
        LogFileList.Delete(0);

    LogFileList.Add(FormatDateTime('c.zzz - ', Now)+Line);
    LogFileList.SaveToFile(FFileName);
  finally
    LogFileList.Free;
  end;
end;
An der markierten Stelle, scheint etwas nicht zu stimmen. Beim Ausführen des Programms, sagt er, dass er die Datei nicht findet. Obwohl doch erst Create und dann Add kommt?

holliesoft 22. Jul 2009 09:49

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Hi,

wenn die Logdatei noch nicht existiert, dann kann sie auch nicht geladen werden. Daher:



Delphi-Quellcode:
procedure TLogFile.AddLine(Line: string);
var
  LogFileList : TStringList;
  Zeile: String;
begin
  LogFileList := TStringList.Create;
  try
    If FileExists(FFileName) then
      LogFileList.LoadFromFile(FFileName);
    while LogFileList.Count > (MaxLines-1) do
        LogFileList.Delete(0);
    LogFileList.Add(FormatDateTime('c.zzz - ', Now)+Line);
    LogFileList.SaveToFile(FFileName);
  finally
    LogFileList.Free;
  end;
end;
Gruß
Patrick

aaaaaaaaaa_10 22. Jul 2009 09:56

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Ahhh. Logisch :wall:
Danke

Brainshock 22. Jul 2009 15:41

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Zusätzlich kannst du dir dann auch die While Schleife sparen.

DeddyH 22. Jul 2009 15:42

Re: Zeilenanzahl bei name.log Datei begrenzen
 
Stimmt, aber es schadet ja auch nicht, wenn man es so lässt.


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