Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Größe von TStrings in Byte ermitteln (https://www.delphipraxis.net/159499-groesse-von-tstrings-byte-ermitteln.html)

DevidEspenschied 30. Mär 2011 16:06

Delphi-Version: XE

Größe von TStrings in Byte ermitteln
 
Hallo,

ich lese eine Datendatei zur schnelleren Bearbeitung in eine Stringliste vom Typ TStrings ein und möchte gerne anhand der Stringliste erfahren, wie groß die eingelesene Datei in Byte ist.

Leider definiert die Stringlist-Klasse keine entsprechende Funktion und ich habe nur Funktionen gefunden, um die Anzahl der Strings auszulesen. Habe ich da etwas übersehen oder muss ich wirlich für jeden Eintrag in der Stringlist die Länge bestimmen und diese zu einer Größenvariable addieren?

Danke schon mal für die Hilfe.

Luckie 30. Mär 2011 16:08

AW: Größe von TStrings in Byte ermitteln
 
Anzahl der enthaltenen Zeichenketten mal Länge der Zeichenketten.

Nachtrag: Und eventuell noch die Anzahl der Zeilenumbrüche (Linefeed, Carriagereturn) dazu addieren.

DeddyH 30. Mär 2011 16:14

AW: Größe von TStrings in Byte ermitteln
 
Und das Ganze mit SizeOf(Char) multiplizieren, sonst kommt bei Unicode ein falsches Ergebnis raus.

[edit] Müsste doch auch mit Length(Stringlist.Text) * SizeOf(Char) zu machen sein, das wäre zumindest einfacher. [/edit]

Luckie 30. Mär 2011 16:16

AW: Größe von TStrings in Byte ermitteln
 
Stimmt ich habe die Text Eigenschaft vergessen.

p80286 30. Mär 2011 16:58

AW: Größe von TStrings in Byte ermitteln
 
Und was spricht gegen filesize ?
Gruß
K-H

Christian Seehase 30. Mär 2011 17:07

AW: Größe von TStrings in Byte ermitteln
 
Zitat:

Zitat von DeddyH (Beitrag 1092058)
[edit] Müsste doch auch mit Length(Stringlist.Text) * SizeOf(Char) zu machen sein, das wäre zumindest einfacher. [/edit]

Das funktioniert nur bedingt, nämlich dann, wenn die Zeilen #13#10 als Zeilenvorschub haben, und die letzte Zeile mit #13#10 abgeschlossen wird.
Wenn man die Eigenschaft Text verwendet werden alle Zeilenvorschübe auf #13#10 angepasst (auch, wenn in der Datei evtl. nur #10 verwendet wird), und die letzte Zeile wird auch mit #13#10 beendet (auch wenn die Datei am letzten Zeichen der letzten Zeile ohne weiteren Zeilenvorschub endet.)

Beispiel:


Delphi-Quellcode:
const
  _sContent = 'Zeile1'#10'Zeile2'#10'Zeile3';

var
  sl : TStringList;

begin
  sl := TStringList.Create;
  try
    ShowMessage(IntToStr(Length(_sContent)));
    sl.Text := _sContent;
    ShowMessage(IntToStr(Length(sl.Text)));
  finally
    sl.Free;
  end;
end;
Erste Ausgabe 20, zweite 24.
Das gilt auch, wenn man die Daten aus einer Datei einliest.
Deswegen kann man mit TStringList auch so schön Dateien mit die #10 als Zeilenvorschub haben durch laden und speichern mit #13#10 versehen :wink:

himitsu 30. Mär 2011 17:30

AW: Größe von TStrings in Byte ermitteln
 
Und nicht zu vergessen die Zeichenkodierung der Datei.
Also nein, du kannst nicht Anhand der StringList auf die Größe der Datei zurückschließen.

DeddyH 31. Mär 2011 08:18

AW: Größe von TStrings in Byte ermitteln
 
Wobei p80286 schon Recht hat, wozu mit TStringlist rumhantieren, wenn das über FileSize einfacher geht? Oder von hinten durch die Brust ins Auge: einen Stream erstellen, Datei laden und Stream.Size auslesen :stupid:

DevidEspenschied 31. Mär 2011 10:12

AW: Größe von TStrings in Byte ermitteln
 
FileSize geht leider nicht, da es sich um eine verschlüsselte Datei handelt, die entschlüsselt und dann ins StringList eingelesen wird. Die Dateigrößen zwischen verschlüsselter und entschlüsselter Datei sind nicht gleich.

Sobald die Datei entschlüsselt ist, steht in ihr die entschlüsselte Dateigröße, die ich mit der tatsächlichen gegenprüfen muss. Deswegen meine Frage nach der Größe...

Was ich auch ausschließen kann ist Unicode, jedes Zeichen ist also als AnsiChar codiert. Insofern werde ich wohl die Anzahl der StringList-Einträge und die jeweiligen Zeichenlängen durchgehen müssen. Hätte ja sein können, dass es einfacher geht.

DeddyH 31. Mär 2011 10:15

AW: Größe von TStrings in Byte ermitteln
 
Aber auch damit bekommst Du u.U. nicht die exakte Dateigröße, wie oben bereits demonstriert.

Klaus01 31. Mär 2011 10:17

AW: Größe von TStrings in Byte ermitteln
 
Hallo,

warum legst Du nicht die entschlüsselten Daten in einen Stream (MemoryStream)ab.
Die Größe wäre dann Stream.size.

Grüße
Klaus

DeddyH 31. Mär 2011 10:25

AW: Größe von TStrings in Byte ermitteln
 
Streams hatte ich auch schon erwähnt, aber es bleibt das Problem mit den Zeilenumbrüchen. Nun kommt es darauf an, wie genau er die Angabe braucht.

Klaus01 31. Mär 2011 10:29

AW: Größe von TStrings in Byte ermitteln
 
.. sollten im Stream der entschlüsselten Datei die Zeilenumbrüche nicht gleich der Zeilenumbrüche der Originaldatei sein?

(Habe Deinen Hinweis bzgl. Streams überlesen :o( muss am Jetlag liegen)
Grüße aus Seoul
Klaus

DeddyH 31. Mär 2011 10:31

AW: Größe von TStrings in Byte ermitteln
 
Achso, Du meinst, bevor die Daten in der Stringliste landen? In dem Fall sollte das passen, denke ich.

DevidEspenschied 31. Mär 2011 10:34

AW: Größe von TStrings in Byte ermitteln
 
Ich werde mal versuchen, die StringList-Einträge durchzuzählen und die Längen zu addieren. Möglicherweise erhalte ich genau die Dateigröße. Infos folgen...

Ein MemoryStream ist mir auch schon in den Sinn gekommen, allerdings greifen meine Routinen zeilenweise auf die entschlüsselte Datei zu (quasi wie eine sehr lange INI-Datei), und das scheint mit Streams umständlich wenn nicht sogar unmöglich zu sein. Kann mich aber auch irren...

Satty67 31. Mär 2011 11:11

AW: Größe von TStrings in Byte ermitteln
 
Irgendeine Funktion/Methode entschlüsselt doch die Quelle. Warum nicht gleich da den Output zählen und am Ende übergeben?

DevidEspenschied 31. Mär 2011 12:08

AW: Größe von TStrings in Byte ermitteln
 
So ich habe die Lösung: Durchzählen der StringList plus 2 Zeichen pro Zeile (#10, #13). Das ergibt genau die Dateigröße.

mleyen 31. Mär 2011 12:13

AW: Größe von TStrings in Byte ermitteln
 
Delphi-Quellcode:
function StrLstSize(const AStrLst: TStringList): Cardinal;
begin
  if Assigned(AStrLst) then
    Result := Length(AStrLst.Text) * SizeOf(Char)
  else
    Result := 0;
end;

himitsu 31. Mär 2011 12:22

AW: Größe von TStrings in Byte ermitteln
 
Zitat:

* SizeOf(Char)
seine Datei ist als ansi gespeichert und nicht als Unicode

DevidEspenschied 31. Mär 2011 12:48

AW: Größe von TStrings in Byte ermitteln
 
AnsiChar anstatt Char, habe ich schon geändert.

DeddyH 31. Mär 2011 13:01

AW: Größe von TStrings in Byte ermitteln
 
*Buh* Codeklau :tongue:


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