Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Ограничение IniReadSection() в 32 КБ (http://forum.oszone.net/showthread.php?t=204860)

Coutty 15-04-2011 13:47 1658971

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

Затем нашёл в справке: "Для Win9x совместимости возвращаются только первые 32767 символов раздела".
Нельзя ли это ограничение обойти кроме как написанием своего парсера ini-файлов?

Версия AutoIt - 3.3.6.1

Creat0R 15-04-2011 16:42 1659112

Цитата:

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

Нет.

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

Код:

#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 15-04-2011 17:40 1659146

Creat0R, спасибо большое! То, что нужно)

-TRM- 15-04-2014 12:46 2338332

Creat0R, Огромнейшее спасибо !

AZJIO 16-04-2014 10:07 2338729

-TRM-,

IniVirtual (AZJIO)
IniEx (DXRW4E)
IniString (ResNullius & MrCreatoR (G.Sandler))

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


Время: 20:59.

Время: 20:59.
© OSzone.net 2001-