Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Einlesen von Datei mittels TFileStream (https://www.delphipraxis.net/70633-einlesen-von-datei-mittels-tfilestream.html)

faux 1. Jun 2006 21:23


Einlesen von Datei mittels TFileStream
 
Hallo!

Also ich schreibe ein LogFile ine Datei mittels FileStream. Ich schreibe pro Zeile immer einen Logeintrag.
Eine Zeile beginnt immer so:
Code:
[b]NUL[/b][yyyy-mm-dd hh:mm:ss] [LogType] Logeintrag
Also jede Zeile beginnt mit einem 0-Zeichen.
Wie kann ich jetzt diese Zeilen wieder einlesen?
Ich habe bis jetzt so gut wie noch nichts mit FileStreams gemacht und will jede LogZeile (also von NUL bis NUL) in ein StringGrid laden. Könnte mir wer da ein Beipiel geben bitte?

Grüße
Faux

F.W. 1. Jun 2006 21:36

Re: Einlesen von Datei mittels TFileStream
 
Schreib einen String in die Datei mit den Zeichen #13#10 am Ende (Zeilenumbruch).
Dann kannst du die Datei nachher mit einer TStringList einlesen und kannst auf die Zeilen zugreifen.
Du könntest das Schreiben auch gleich mit einer STringList machen, aber der TFileStream bietet sich wegen seines sofortigen Schreibens an.

Öffne den FileStream so:

Delphi-Quellcode:
var
 FS: TFileStream;
begin
 FS := TFileStream(FileName, fmOpenWrite);
 try
   FS.Seek(0, soFromEnd);

   FS.WriteBuffer(S[1], Length(S)); //S ist dein String mit #13#10 am Ende
 finally
   FS.Free;
 end;
end;
Ich hoffe das hilft dir weiter! ;-)

faux 1. Jun 2006 21:48

Re: Einlesen von Datei mittels TFileStream
 
Zitat:

Zitat von F.W.
Schreib einen String in die Datei mit den Zeichen #13#10 am Ende (Zeilenumbruch).

Ja, das habe ich, aber nur zusätzlich.

Naja, ich sehe gerade dein Vorschlag bezieht sich eher auf das Schreiben, das habe ich aber bereits gelöst. Mir geht es ums Auslesen der Datei. ;)

Aber dein Vorschlag mit der TStringList war mal nicht so schlecht. Habe es so gelöst:
Delphi-Quellcode:
procedure TForm1.RefreshLogClick(Sender: TObject);
var
  LogFile: TFileStream;
  List: TStringList;
  i: Integer;
begin
  LogFile := TFileStream.Create(DllPath + '\sql.log', fmOpenRead or fmShareDenyNone);
  List := TStringList.Create;
  List.LoadFromStream(LogFile);
  for i := 0 to List.Count - 1 do
  begin
    StringGrid1.Cells[1, i] := List[i];
  end;
  List.Free;
  LogFile.Free;
end;
Grüße
Faux

F.W. 2. Jun 2006 17:20

Re: Einlesen von Datei mittels TFileStream
 
Zum Laden einer Textdatei nimm doch die Methode >LoadFromFile< der TStringList ;-)

faux 2. Jun 2006 19:01

Re: Einlesen von Datei mittels TFileStream
 
Zitat:

Zitat von F.W.
Zum Laden einer Textdatei nimm doch die Methode >LoadFromFile< der TStringList ;-)

Das geht leider nicht, da die Datei gerade gesperrt ist, zum Zeitpunkt des Zugriffs. Wenn ich fmShareDenyNone nicht übergebe, gibts gleich nen Fehler (auch bei LoadFromFile).

Grüße
Faux

F.W. 3. Jun 2006 00:03

Re: Einlesen von Datei mittels TFileStream
 
Ach so, dann ist das natürlich die beste Lösung

Hawkeye219 3. Jun 2006 00:50

Re: Einlesen von Datei mittels TFileStream
 
Auf die temporäre Stringliste könnte man noch verzichten:

Delphi-Quellcode:
procedure TForm1.RefreshLogClick(Sender: TObject);
var
  LogFile: TFileStream;
begin
  LogFile := TFileStream.Create(DllPath + '\sql.log', fmOpenRead or fmShareDenyNone);
  StringGrid1.Cols[1].LoadFromStream(LogFile);
  LogFile.Free;
end;
Gruß Hawkeye

faux 3. Jun 2006 05:08

Re: Einlesen von Datei mittels TFileStream
 
Zitat:

Zitat von Hawkeye219
Auf die temporäre Stringliste könnte man noch verzichten:

Delphi-Quellcode:
procedure TForm1.RefreshLogClick(Sender: TObject);
var
  LogFile: TFileStream;
begin
  LogFile := TFileStream.Create(DllPath + '\sql.log', fmOpenRead or fmShareDenyNone);
  StringGrid1.Cols[1].LoadFromStream(LogFile);
  LogFile.Free;
end;
Gruß Hawkeye

Ja, das habe ich mittlerweile auch so gemacht, Danke.
Ich wollte ursprünglich das ganze noch etwas verändern, deswegen die StringList. :)

Grüße
Faux

Christian Seehase 3. Jun 2006 11:53

Re: Einlesen von Datei mittels TFileStream
 
Moin Manuel,

eine Idee hätte ich noch.
Verzichte auf das #00 am Anfang, und #13#10 am Ende.
Schreibe statt dessen die Länge der Zeile vor die Zeile.
Diese dann auslesen, und Du kannst exakt die jeweilige Zeile aus dem Stream lesen.

faux 3. Jun 2006 12:01

Re: Einlesen von Datei mittels TFileStream
 
Zitat:

Zitat von Christian Seehase
Verzichte auf das #00 am Anfang, und #13#10 am Ende.
Schreibe statt dessen die Länge der Zeile vor die Zeile.
Diese dann auslesen, und Du kannst exakt die jeweilige Zeile aus dem Stream lesen.

Gute Idee! Werde ich mirmerken, da ich das sicherlich nochmal brauche.
Danke!

Grüße
Faux


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