Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#3

Re: TFileStringList

  Alt 16. Mai 2010, 12:56
So, hat ein bissl länger gedauert, als geplant.

Hab noch nich alles getestet, aber es scheint zu laufen.
(grade eben einen hartnäckigen/fießen Fehler ausgemärzt, welcher alles aufhielt ... schon blöd, wenn man beim Löschen eines Puffers vergißt das Offset entsprechend zu verschieben )

Aber es wird noch Einiges geändert werden: (weshalb ich einige Testes erstmal verschoben hab)
  • Vorallem ist es derzeit noch von TStrings abgeleitet.
    Aber ich schau demnächst, wie ich es von TStringList ableiten kann.

    (da muß man allerdings mehr aufpassen, da TStringList vorallem schon seine eigene Speicherverwaltung mitbringt ... also daß diese mir dann nicht in die Quere kommt, da ich ja eine Eigene hab)
  • Nja, die "normale" Speicherroutine (.Flush) hatte einen Fehler, weshalb diese auch inaktiv ist.
    Sie wird aktuell über SecureFlush umgeleitet, welches die Daten über eine temporäre Datei handhabt, anstatt alles direkt in der Datei umzuorganisieren.
  • Das war's eigentlich, was an Änderungen geplant ist.
    Und es wird womit eigentlich nur noch interne Umstruktorierungen geben.

Gut, nun schonmal was zur Klasse:
  • Man kann diese StringListe mir einer Textdatei verbinden, wobei die Strigs/Zeilen nicht in den Arbeitsspeicher geladen werden.
  • Die StringListe kann aber auch mit irgendeinem einem Stream verbunden sein.
    ( dieses geschieht jeweils entweder über .Create oder über AssignToFile, bzw. AssignToStream )
  • Änderungen landen im Arbeitsspeicher, können aber entweder in die Datei (.Flush) oder in eine intern verwaltete temporäre Datei (im %TEMP%-Verzeichnis) ausgelagert werden.
  • Die Temp-Datei sollte vom System (Windows) automatisch gelöscht werden, sobald alle Handles geschlossen sind.
  • Abgesehn von der Indexliste und den Änderungen belastet also nix den Arbeitsspeicher.
  • Die StringListe kann aber auch ohne verbundene Datei/Stream verwendet werden, wo sie dann als Hasched-StringList, mit der Möglichkeit einer Auslagerung in eine Tempdatei, genutzt werden kann.
  • Zwei wichtige Änderungen, gegenüber allen anderen StringList-Klassen (TStrings und Co.) muß ich aber erwähnen:

    Wenn man einer Zeile (.Add, .Insert .Strings[] und Co.) einen Text übergibt, welcher Zeilenumbrüche oder ein #0 enthält, dann wird ab der #0 abgebrochen und an den Zeilenumbrüchen wird es zerlegt.
    SL.Add('abc'#10'xyz'); Bei TStringList führt dieses nur zu einer Zeile.
    Es ist alles zusammen über .Strings auslesbar und natürlich erhöt sich .Count nur um 1.

    Bei meiner TFileStringList werden entsprechend 2 Zeilen eingefügt, damit die Zeilenzählung korrekt arbeitet.
  • Und vielleicht ist schonmal der zusätzliche Zeilenumbruch aufgefallen, welchen die anderen Stringlisten nach die letze Zeile schmuggeln oder der Zeilenumbruch nach der letzen Zeile, welcher in der Datei nich vorhanden ist, aber in der Stringliste ... das passiert hier auch nicht.

    Ist in der Datei nach der letzen Zeile ein Zeilenumbruch, dann gibt es in der SL eine Leerzeile am Schluß.
    Und dafür wird beim Speichern nach der letzen Zeile kein Zeilenumbruch eingefügt.
    Fazit: steht in der Datei kein Zeilenumbruch als Letzes, dann wird auch keiner beim Speichern eingefügt, wärend TStringList und Co. diesen einfügen.


( PS: nicht über die auskommentierten Zeilen im Klassen-Header wundern ... es ist nur alles Mögliche ein bissl sortiert aufgelistet, welches quasi unterstützt wird, was aber nicht unbedingt direkt in der Klasse implementiert ist. )

[edit]
Die Version mit der Ableitung von TStringList scheint so weit ok zu sein ... hoff ich mal, da so einiges umgeleitet/verschoben werden mußte.
Angehängte Dateien
Dateityp: pas indexstringlist_253.pas (54,1 KB, 21x aufgerufen)
Dateityp: pas indexstringlist_784.pas (53,5 KB, 24x aufgerufen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat