Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Klasse für sehr große Ini-Dateien + Unicode gesucht (https://www.delphipraxis.net/115244-klasse-fuer-sehr-grosse-ini-dateien-unicode-gesucht.html)

Aurelius 9. Jun 2008 08:12


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 :)

Aurelius 11. Jun 2008 13:11

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...

vsilverlord 11. Jun 2008 13:17

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?

Aurelius 11. Jun 2008 13:35

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...

Neutral General 11. Jun 2008 13:50

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

Aurelius 11. Jun 2008 13:56

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Registry-Sicherungen sind nun mal im Ini-Format gesichert...

alzaimar 11. Jun 2008 14:05

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?

Gausi 11. Jun 2008 14:12

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.

Aurelius 11. Jun 2008 19:00

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...

Gausi 11. Jun 2008 20:00

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.

Aurelius 12. Jun 2008 13:11

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...

Gausi 12. Jun 2008 13:21

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);

Aurelius 12. Jun 2008 13:54

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Ich werde es mal versuchen und melde mich dann...

himitsu 12. Jun 2008 13:59

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Delphi-Quellcode:
// schreiben
ini.WriteString('Section', 'MeinWideStringWert', Utf8Encode(MyWideStringVar));

// lesen
MyWideStringVar := Utf8Decode(ini.ReadString('Section', 'MeinWideStringWert'));
läßt sich auch mit den anderen NichtUnicodeKlassen so machen


oder notfalls 'ne Klasse ableiten und diese Konvertierung darin machen.

Aurelius 13. Jun 2008 07:49

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)...

toms 13. Jun 2008 08:40

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.

himitsu 13. Jun 2008 11:03

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;

Assertor 13. Jun 2008 11:39

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 32k statt 64k.

Nutzt Du denn wirklich INI files > 32/64k auf Win98?

Gruß Assertor

Aurelius 16. Jun 2008 08:57

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 http://forum.vingrad.ru/forum/s/b375...1036793/0.html, aber leider kann ich mit meinen beschränkten Russisch-Kenntnissen kein Login finden^^

Assertor 16. Jun 2008 09:03

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Hi xX0815Xx,

Zitat:

Zitat von xX0815Xx
Wo bekomm ich denn die TntInis her?

Das ganze TntUnicode Paket gibt es z.B. noch bei
Delphi Inspiration.

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

Aurelius 16. Jun 2008 09:19

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Da gibt es aber eben keine TntIniFile dabei (siehe hier: http://www.delphipraxis.net/internal...=794296#794296)

Assertor 16. Jun 2008 09:25

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Zitat:

Zitat von xX0815Xx
Da gibt es aber eben keine TntIniFile dabei (siehe hier: http://www.delphipraxis.net/internal...=794296#794296)

Ja, gerade nachgesehen - das stimmt leider. Die TntIniFile Geschichte ist eine der Erweiterungen, die in TMS Unicode enthalten ist - also kostenpflichtig. Sollte die Datei auf dem russischen Server die gleiche sein, wäre das eine illegale Kopie...

Dann nimm einfach die Lösung von himitsu :)

Gruß Assertor

himitsu 16. Jun 2008 09:42

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Zitat:

Zitat von Assertor
Dann nimm einfach die Lösung von himitsu :)

hat auch den Vorteil, daß die Datei so immernoch mit NichtUnicode-Dingen (also zu den alten NichtUnicode-INIs) kompatibel ist :angel:
(und sogar, im Durchschnitt, etwas Speicher einspart)

Aurelius 16. Jun 2008 12:13

Re: Klasse für sehr große Ini-Dateien + Unicode gesucht
 
Und wie mach ich das wenn ich die Unicode-Sections lesen will?

himitsu 16. Jun 2008 13:06

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.

Aurelius 16. Jun 2008 13:30

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.

Aurelius 17. Jun 2008 08:13

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