Format zapisu danych INI (limity)

Format zapisu danych INI (limity)
Pepe
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 7 godzin
  • Postów:496
0

Hej,
Bardzo lubię korzystać z formatu INI.
Używam klasy TMemIniFile, z najnowszego Delphi 12.1 CE. Idealnie nadaje się do zapisu konfiguracji/prostych danych

Mam jednak pewne obawy co do limitu plików INI (jeśli takowe obecnie są):

  1. Objętościowego (ponoć cały plik może mieć max. 64kb) - to raczej na pewno już nieprawda
  2. Znakowego dla linii (ponoć 1024 znaki)

Ale, to chyba informacje stare (z czasów Windows 9x). Jak to jest dzisiaj?
Czy może być tak, że Delphi współczesne ma tę implementację własną, nowoczesną - bez limitów?
Gdzie można znaleźć pewną informację? A może ktoś z was wie (przypomnę, że chodzi mi o implementację z najnowszego Delphi)?
Ciekawe jak to jest w Lazarus.

Ps: Owszem, teoretycznie mogę sprawdzić czy plik jest zapisywany/odczytywany - ale jest to trudne i żmudne.


KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
4

Zajrzałem do źródeł Delphi 11 (nie instalowałem jeszcze 12) i widzę coś takiego:

Kopiuj
function TIniFile.ReadString(const Section, Ident, Default: string): string;
var
  Buffer: array[0..2047] of Char;
begin
                                                                                                                   
  SetString(Result, Buffer, GetPrivateProfileString(MarshaledString(Section),
    MarshaledString(Ident), MarshaledString(Default), Buffer, Length(Buffer),
    MarshaledString(FFileName)));
end;

Więc wygląda na to, że te zaszłości są nie aktualnie nie mniej jednak są limity prawdopodobnie (nie chce mi się sprawdzać reszty) wszystkie zgodne z tym https://stackoverflow.com/a/65870674 .


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
Pepe
Ale dobrze rozumiem, że ilość znaków odczytywanego ciągu znaków to max 2kb? Ps: Sprawdziłem, w Delphi 21.1 jest tak samo (2kb dla ReadString i 16Kb dla ReadSections (z opcją zwiększenia bufora).
KA
Wygląda na to że tak, bo ktoś wymyślił, że Buffer ma wielkość zadeklarowaną na stałe, zamiast zrobić trzeci parametr z domyślną wartością. Chyba że funkcja WinApi GetPrivateProfileString i tak nie obsługuje więcej (tego nie wiem). Z testu @Paweł Dmitruk wygląda na to że Lazarus obsługuje więcej. Prawdopodobnie tam to jest zrobione inaczej i być może w ogóle nie nie korzysta z funkcji WinApi a Delphi tak (przynajmniej tak wynika ze źródeł RTL).
PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 12 godzin
4

Przetestowałem w Lazarus obsługę plików INI i bez problemu działa z plikami ~500mb oraz liniami po 16mb.


pozdrawiam
paweld
Zobacz pozostały 1 komentarz
flowCRANE
Nie szok, po prostu w Lazarusie te klasy są zupełnie niezależne i wieloplatformowe, więc limity przestarzałego Win32 API nie mają w nich zastosowania. W Lazarusie, cały plik ładowany jest do pamięci w konstruktorze klasy TIniFile — tam wywoływana jest metoda ReadIniValues, która ładuje cały plik do TStringList, a potem go parsuje i rozkłada na sekcje i klucze.
Pepe
No Lazarus tutaj wymiata! Chyba TMemIniFile robi tak samo, co? Bo ona parsuje w pamięci, i dopiero po wywołaniu metody UpdateFile zapisuje do pliku...
flowCRANE
TMemIniFile nie ładuje niczego do pamięci — ta klasa służy do tworzenia nowej (pustej) konfiguracji, z możliwością jej zapisu do pliku.
Pepe
Hmm, nie wiem co masz na myśli pisząc "nie ładuje niczego do pamięci", skoro właśnie ta klasa to robi. Plik INI jest odczytywany raz przy tworzeniu obiektu klasy, a wszystkie operacje buforowane są w pamięci (operuje na zagnieżdżonych listach). Zapis na dysk jest tylko po wywołaniu metody UpdateFile. Albo ja czegoś nie rozumiem, albo my się nie rozumiemy. Ale to nie ma znaczenia, mnie chodzi tylko o poznanie limitu tego formatu... wtedy zdecyduję czy użyć xml albo json...
flowCRANE
Nie, nieważne — przeoczyłem inherited, więc dane są ładowane w konstruktorze klasy TMemIniFile.
MY
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 13 godzin
  • Postów:1083
0

Z tego co kojarzę chyba nie ma 'oficjalnego' standardu formatu *.ini więc każdy system/program może to robić po swojemu. Co więcej Microsoft radzi aby używać rejestru systemowego w miejsce pliku ini. Więc nie zdziwiłbym się jakby API Windows'a miały te same limity o których wspominasz @Pepe Wszystko zależy czy w kasie TIniFile są używane funkcje systemowe, czy własne. Jednak z tego co @kAzek wrzucił niestety limity są aktualne.

Tak więc jeśli chcesz zapisywać więcej, pozostaje Ci używanie jakiejś innej klasy bądź napisanie tego samemu. Co nie będzie raczej trudne. Ewentualnie możesz dane zapisywać w rejestrze systemowym jeśli działasz tylko na Windows.

SK
Ja często używam JSON zamiast INI. Nie trzeba wtedy nic "pisać samemu".
MY
@skrzat też tak można. Akurat INI używam do trzymania naprawdę małych config'ów więc te ograniczenia tak naprawdę nie są dla mnie przeszkodą. Chociaż ostatnio gdzie się da przechodzę na rejestr systemu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.