![]() |
Klasse für sehr große Ini-Dateien + Unicode gesucht
Liste der Anhänge anzeigen (Anzahl: 2)
Hi DPler :hi:
Ich benötige eine Ini-Klasse, welche auch sehr große Dateien (Registry-Dateien mit mehreren Dutzend MB) bearbeiten kann. Dafür gibt es ja eigtl. schon genug Klassen (TMemIni, TBigIni, TFastIni). Problem an der Sache ist aber dass diese Klasse zwingend Unicode beherrschen muss (jedenfalls nehme ich das stark an). Ich habe mal alle getestet und bin zu folgendem Ergebnis gekommen: - TIni: liest zwar ein, aber bei weitem nicht alle Sections - TMemIni: es passiert gar nichts - TBigIniFile: wie bei TMemIni - TFastIni: arbeitet zwar, allerdings hat die übergebene Stringlist keinen Inhalt Ich habe auch schon versucht, TBigIni und TFastIni auf Widestrings sowie die TWStrings aus der JclWideStrings umzuändern, allerdings ohne Erfolg. (Ich habe euch mal beide Original-Klassen angehängt, vielleicht bekommt ihr das hin). Deswegen hoffe ich auf eure Hilfe :) |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
:wiejetzt: Ab nach oben :wiejetzt: Es würde mir auch reichen wenn es eine Stringlist geben würde die Unicode + mit großen Dateien umgehen kann, dann müsste ich mir das eben selbst bauen... |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Kannst du dazu nicht mehrere Ini-Dateien benutzen? Also ich meine mehrere Inidateien als Datenträger, und diese dann im Programm wie eine große betrachten?
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Wen ich eine Methode kennen würde um eine bestehende große Datei zu splitten und diese gesplitteten Dateien später wieder zu einer zusammenzufügen wäre das durchaus möglich, aber viel lieber würde ich mit 1 Datei arbeiten...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Müssen es denn Inis sein? Bist du dir sicher das Inis da so ne gute Lösung sind? Ich glaube Inis sind nicht dafür gedacht riesige Datenmengen zu speichern.
Habe früher auch für alles mögliche Inis benutzt aber bin dann irgendwann schnell davon weggekommen. Gruß Neutral General |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Registry-Sicherungen sind nun mal im Ini-Format gesichert...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Ja, scheint es nicht zu geben, denn -wie gesagt- INI-Dateien bla...64k bla...
Nimm halt ein Array Of WideString.... Ist es denn so kompliziert, was Du machen willst, oder bekommt man das zur Not auch so gebacken? |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Du kannst die Unicode-Strings auch UTF-8 kodieren und diese in normalen Inis verwalten. Das Größenproblem besteht dann aber weiterhin.
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
@ Gausi: Wie konvertiere ich das ganze denn? Mit normalen Strings geht es ja mit z.B. TMemIni...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Mit Utf8Encode und Utf8Decode. Man packt einen Widestring rein, und bekommt einen UTF-8-String raus (oder halt umgekehrt), den man ganz prima als "normalen" String behandeln kann.
Man muss dann bei Inis nur die (De-)Kodierung zwischenschalten, also nicht die Widestring-Variablen direkt lesen/schreiben, sondern das ganze über zusätzliche Strings laufen lassen, die nach dem Lesen aus der Ini in WideStrings konvertiert werden, bzw. die vor dem Schreiben in die Ini aus den Widestrings gebildet wurden. |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Könntest du dir vielleicht mal meine angehängten Klassen oben anschauen und sagen wo ich das machen muss? Ich bekomm das gerade einfach nicht hin...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Ich geh einfach mal von der normalen Ini-Klasse aus, die ich auch an einigen Stellen zum Speichern von Unicode-Strings benutze. Aber wie schon gesagt: Wenn die Datei zu groß wird, dann wird das ineffizient. Dann sollte man sich ggf. ein eigenes Format für die Dateien überlegen - kommt drauf an, was man machen möchte.
Delphi-Quellcode:
var tmp: String;
//... // schreiben: tmp := Utf8Encode(MyWideStringVar); ini.WriteString('Section', 'MeinWideStringWert', tmp); //lesen: tmp := ini.ReadString('Section', 'MeinWideStringWert', '-'); MyWideStringVar := Utf8Decode(tmp); |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Ich werde es mal versuchen und melde mich dann...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Delphi-Quellcode:
läßt sich auch mit den anderen NichtUnicodeKlassen so machen
// schreiben
ini.WriteString('Section', 'MeinWideStringWert', Utf8Encode(MyWideStringVar)); // lesen MyWideStringVar := Utf8Decode(ini.ReadString('Section', 'MeinWideStringWert')); oder notfalls 'ne Klasse ableiten und diese Konvertierung darin machen. |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Das geht so leider nicht, da die Liste ja leer bleibt. Das Bearbeiten der Klassen funktioniert nicht (bzw. ich schaffs einfach nicht)...
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Kennt jemand die TntIniFiles? Diese unterstützen auch Unicode.
Bin mir aber nicht sicher, ob sie >64KB unterstützen. |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
'ne Erweiterung für TBigIniFile könnte z.B. so aussehn.
(ein ReadAnsiString und WriteAnsiString gibt's in TBigIniFile ja auch schon)
Delphi-Quellcode:
type
TWideBigIniFile = class(TBigIniFile) public function ReadWideString(const aSection, aKey: string; const aDefault: WideString): WideString; virtual; procedure WriteWideString(const aSection, aKey: string; const aValue: WideString); virtual; end; function TWideBigIniFile.ReadWideString(const aSection, aKey: string; const aDefault: WideString): WideString; begin Result := Utf8Decode(ReadString(aSection, aKey, Utf8Encode(aDefault))); end; procedure TWideBigIniFile.WriteWideString(const aSection, aKey: string; const aValue: WideString); begin WriteString(aSection, aKey, Utf8Encode(aValue))); end; |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Hi,
also TTnt(Mem)IniFile bzw. T(Mem)IniFile nutzen beide GetPrivateProfileString/WritePrivateProfileString. Nur nutzt Tnt eben die WideString Funktionen. Aber eine generelle Rückfrage: Das Limit betrifft afaik doch nur Win98SE und älter. Dort dann ja teilweise auch ![]() Nutzt Du denn wirklich INI files > 32/64k auf Win98? Gruß Assertor |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Danke für die Antworten!
@ himitsu: Danke, ich werde es mal testen! @ Assertor: Ich möchte Reg-Dateien einlesen, welche ja im Enddefekt nur Ini-Dateien sind. Diese sind aber sehr, sehr groß (komplette Reg-Sicherung beträgt z.B. auf meinem Laptop 70 MB). Wo bekomm ich denn die TntInis her? Die suche findet nur einen Verwei sauf ![]() |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Hi xX0815Xx,
Zitat:
![]() Himitsus Idee mit der Klassenerweiterung für UTF8Encode/Decode finde ich übrigens sehr gut geeignet, so etwas nutze ich an anderer Stelle auch. Gruß Assertor |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Da gibt es aber eben keine TntIniFile dabei (siehe hier:
![]() |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Zitat:
Dann nimm einfach die Lösung von himitsu :) Gruß Assertor |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Zitat:
(und sogar, im Durchschnitt, etwas Speicher einspart) |
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Und wie mach ich das wenn ich die Unicode-Sections lesen will?
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
bei dieser Erweiterungs-Variante gibt es "nur" Unicode-Values .. für mehr müßte man auch noch alle Funktionen so überschreiben, daß Sections die Keys auch noch Unicode wären ... also anz überladen/-schreiben.
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Hm, klingt kompliziert. Das ganze habe ich ja schon versucht umzustellen, aber ich bekomm das eben einfach nicht hin.
|
Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
Ich hab mir das mal runtergeladen und getestet, funktionieren tut das auch einwandfrei. Allerdings möchte ich das nicht nutzen wenn es eine illegale Kopie ist. Allerdings sehen die Kommentare für mich nicht so aus...
Delphi-Quellcode:
{*****************************************************************************}
{ } { Tnt Delphi Unicode Controls } { } { Portions created by Wild Hunter are } { Copyright (c) 2003 Wild Hunter (raguotis@freemail.lt) } { } { Portions created by Stanley Xu are } { Copyright (c) 1999-2006 Stanley Xu } { ([url]http://gosurfbrowser.com/?go=supportFeedback&ln=en[/url]) } { } { Portions created by Borland Software Corporation are } { Copyright (c) 1995-2001 Borland Software Corporation } { } {*****************************************************************************} {*****************************************************************************} { } { Tnt Delphi Unicode Controls } { [url]http://www.tntware.com/delphicontrols/unicode/[/url] } { Extended TTntMemIniFile (compatible with all versions) } { } { Copyright (c) 1999-2007 Stanley Xu } { [url]http://getgosurf.com/?go=supportFeedback&ln=en[/url] } { } {*****************************************************************************} {*****************************************************************************} { } { BACKGROUND: } { TTntMemIniFile buffers all changes to the INI file in memory. To write } { the data from memory back to the associated INI file, call the } { UpdateFile() method. However, the whole content of this INI file will } { be overwritten. Even those sections that are not used. This will make } { troubles, if two instances try to change the same file at the same } { time, without some method of managing access the instances may well end } { up overwriting each other's work. } { } { IDEA: } { TTntMemIniFileEx implementes a simple idea: To check the timestamp } { before each operation. If the file is modified, TTntMemIniFileEx will } { reload the file to keep the content updated. } { } { CONCLUSION: } { # TTntMemIniFileEx and TTntMemIniFile are ideal for read-only access. } { For instance: To read localization files, etc. } { # To perform mass WriteString() operations, please use the following } { code. } { BeginUpdate(); } { try } { for I := 0 to 10000 do } { WriteString(...); } { finally; } { EndUpdate(); } { UpdateFile; } { end; } { } {*****************************************************************************} |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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