![]() |
Re: Textdatei mit TFileStream
bei großen Dateien bin ich der Meinung das dein Vorschlag gut ist. Denn wie du bereits geschrieben hast wird bei Stringlisten die gesammte Datei in den speicher geladen was nicht gerade performant ist. Und da wir schon einige Jahre objectorientiert programmieren bin ich auch dafür das TFilestream anstelle von AssignFile genutzt wird (selbst wenn es intern vielleicht auch noch genutzt wird)
|
Re: Textdatei mit TFileStream
Moin Andreas,
Zitat:
|
Re: Textdatei mit TFileStream
Meine Programm ist ein Netzwerk Traffic Monitor und pro Tag und Session wird eine neue Zeile erstellt, was für ein Jahr (und mein Benutzer möchte gerne ein Jahr loggen) also 365*2 Zeilen bedeutet, wenn man annimmt, dass pro Tag eine Session stattfindet. Meiner Meinung nach fällt das unter große Datei...
Der StringStream interessiert mich sehr, aber wenn ich folgenden Code ausführe, lädt er die Datei doch auch als ganzes in den RAM, oder?
Delphi-Quellcode:
Frohe Weihnachten,
StringStream.CopyFrom(FileStream);
Andreas |
Re: Textdatei mit TFileStream
mit folgendem Source kannst du eine bestimmte Zeile aus einem Stream lesen (ab Stream Position)
Delphi-Quellcode:
geht bestimmt noch eleganter aber als Anregung sollte es reichen.
function GetLine(AStream: TStream; ALineNumber: Integer): String;
var LBuffer2, LBuffer: String; LCurrLine, LBytes, LBreakPos: Integer; begin result := ''; SetLength(LBuffer2, 50); LCurrLine := 0; while (LCurrLine <= ALineNumber) and (AStream.Position < AStream.Size) do begin LBytes := AStream.Read(LBuffer2[1], 50); LBuffer := copy(LBuffer2, 1, LBytes); repeat LBreakPos := Pos(#13#10, LBuffer); if LCurrLine = ALineNumber then begin if LBreakPos > 0 then result := result + copy(LBuffer, 1, LBreakPos - 1) else result := result + LBuffer; end; if LBreakPos > 0 then begin LBuffer := copy(LBuffer, LBreakPos + 2, 50); inc(LCurrLine); end; until (LBreakPos < 1) or (ALineNumber < LCurrLine); end; end; |
Re: Textdatei mit TFileStream
Danke, diese Funktion sieht sehr gut aus. Dann werde ich die Datei wohl mit dem TFileStream herauslesen.
@Christian Seehase: Wie hast du das mit dem TStringStream gemeint? CopyFrom() kopiert doch die gesamte Datei in den RAM? Vielen Dank, Andreas |
Re: Textdatei mit TFileStream
Moin Andreas,
ich meinte, dass Du Dir mal TStringStream als Ersatz für TFileStream anschaust. ;-) |
Re: Textdatei mit TFileStream
Hmmm, entweder ich sitze auf der Leitung, oder wir haben hier ein Missverständnis.
Wie soll ich denn den TStringStream statt TFileStream verwenden, wenn ich mit einer Datei arbeite? Edit: Meinst du, dass ich die Blöcke, die ich aus dem TFileStream lese, zum Bearbeiten in den TStringStream schreiben soll, anstatt umständlich "herumzuparsen"? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 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