Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата 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

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community

Это сообщение посчитали полезным следующие участники:

Отправлено: 16:42, 15-04-2011 | #2