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