[решено] Ограничение IniReadSection() в 32 КБ

Ответить
Аватара пользователя
Coutty

[решено] Ограничение IniReadSection() в 32 КБ

Сообщение Coutty »

При работе с функцией IniReadSection() обнаружил, что из секции обрабатываются только первые 32 КБ текста. У меня одна из секций ini-файла содержит около 50 КБ. Таким образом, вместо ~1000 пар ключ-значение я получаю только 640.



Затем нашёл в справке: "Для Win9x совместимости возвращаются только первые 32767 символов раздела".

Нельзя ли это ограничение обойти кроме как написанием своего парсера ini-файлов?



Версия AutoIt - 3.3.6.1
Аватара пользователя
Creat0R

Re: [решено] Ограничение IniReadSection() в 32 КБ

Сообщение Creat0R »

Цитата Coutty:



Нельзя ли это ограничение обойти кроме как написанием своего парсера ini-файлов?
[решено] Ограничение IniReadSection() в 32 КБ




Нет.



Но такие парсеры уже писались до нас, я в своё время этого не знал, и тоже писал свой:





Код:

Код: Выделить всё

#include <Array.au3>
$aReadSect = _IniReadSectionEx("Test.ini", "Marvell", BitOR(1, 8, 16))
_ArrayDisplay($aReadSect)
;$iReadMode:
;            -1, Default -> Read only key=value entries (as default behaviour of IniReadSection)
;
;            The following options can be combined together with BitOR:
;                1 -> Do not read comments
;                8 -> Do not read keys without values
;                16 -> Strip comments in values. This parameter can be added with BitOR to other flags.
Func _IniReadSectionEx($sIniFile, $sSection, $iReadMode=-1)
    Local $aFileReadArr = StringSplit(StringStripCR(FileRead($sIniFile)), @LF)
    If @error Then
        Return SetError(1, 0, "")
    EndIf
    Local $aRetArr[$aFileReadArr[0]+1][2], $iUbound, $iSplitPos, $sKey, $sValue
    For $i = 1 To $aFileReadArr[0]
        If StringRegExp($aFileReadArr[$i], "^\s*\[\Q" & $sSection & "\E\][\s;]*.*") Then
            For $j = $i+1 To $aFileReadArr[0]
                If StringRegExp($aFileReadArr[$j], "^\s*\[[^\]]+\]\s*") Then
                    ExitLoop 2
                EndIf
                $iSplitPos = StringInStr($aFileReadArr[$j], "=")
                If $iSplitPos < 1 Then
                    $iSplitPos = StringLen($aFileReadArr[$j]) + 1
                EndIf
                $sKey = StringLeft($aFileReadArr[$j], $iSplitPos-1)
                $sValue = StringTrimLeft($aFileReadArr[$j], $iSplitPos)
                If $sKey = "" Then
                    ContinueLoop
                EndIf
                If $iSplitPos = 0 Then
                    $sValue = ""
                EndIf
                If $iReadMode <= 0 Or Not IsNumber($iReadMode) Then
                    If Not StringRegExp($aFileReadArr[$j], "\A[^;].*=.*$") Then
                        ContinueLoop
                    EndIf
                Else
                    If BitAND($iReadMode, 1) = 1 Then
                        If StringRegExp($aFileReadArr[$j], "\A(\s+|);") Then
                            ContinueLoop
                        EndIf
                    EndIf
                    If BitAND($iReadMode, 8) = 8 Then
                        If ($sValue = "" Or $sValue = $aFileReadArr[$j]) And Not StringRegExp($aFileReadArr[$j], "\A(\s+|);") Then
                            ContinueLoop
                        EndIf
                    EndIf
                    If BitAND($iReadMode, 16) = 16 Then
                        $sValue = StringRegExpReplace($sValue, ";.*?$", "")
                    EndIf
                EndIf
                $aRetArr[0][0] += 1
                $aRetArr[$aRetArr[0][0]][0] = $sKey
                $aRetArr[$aRetArr[0][0]][1] = $sValue
            Next
            ExitLoop
        EndIf
    Next
    ReDim $aRetArr[$aRetArr[0][0]+1][2]
    Return $aRetArr
EndFunc

Изображение
Аватара пользователя
Coutty

Re: [решено] Ограничение IniReadSection() в 32 КБ

Сообщение Coutty »

Creat0R, спасибо большое! То, что нужно)
Аватара пользователя
AZJIO

Re: [решено] Ограничение IniReadSection() в 32 КБ

Сообщение AZJIO »

-TRM-,



IniVirtual
(AZJIO)

IniEx
(DXRW4E)

IniString
(ResNullius & MrCreatoR (G.Sandler))



тема обсуждения
на официальном сайте.
Ответить

Вернуться в «AutoIt»