Показать полную графическую версию : [решено] Ограничение IniReadSection() в 32 КБ
При работе с функцией IniReadSection() обнаружил, что из секции обрабатываются только первые 32 КБ текста. У меня одна из секций ini-файла содержит около 50 КБ. Таким образом, вместо ~1000 пар ключ-значение я получаю только 640.
Затем нашёл в справке: "Для Win9x совместимости возвращаются только первые 32767 символов раздела".
Нельзя ли это ограничение обойти кроме как написанием своего парсера ini-файлов?
Версия AutoIt - 3.3.6.1
Нельзя ли это ограничение обойти кроме как написанием своего парсера ini-файлов? »
Нет.
Но такие парсеры уже писались до нас, я в своё время этого не знал, и тоже писал свой:
#include (http://www.autoitscript.com/autoit3/docs/keywords.htm##include) <Array.au3>
$aReadSect = _IniReadSectionEx("Test.ini", "Marvell", BitOR (http://www.autoitscript.com/autoit3/docs/functions/BitOR.htm)(1, 8, 16))
_ArrayDisplay (http://dundats.mvps.org/help/html/libfunctions/_arraydisplay.htm)($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 (http://www.autoitscript.com/autoit3/docs/keywords.htm#Func) _IniReadSectionEx($sIniFile, $sSection, $iReadMode=-1)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aFileReadArr = StringSplit (http://www.autoitscript.com/autoit3/docs/functions/StringSplit.htm)(StringStripCR (http://www.autoitscript.com/autoit3/docs/functions/StringStripCR.htm)(FileRead (http://www.autoitscript.com/autoit3/docs/functions/FileRead.htm)($sIniFile)), @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) @error (http://www.autoitscript.com/autoit3/docs/macros.htm#@error) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) SetError (http://www.autoitscript.com/autoit3/docs/functions/SetError.htm)(1, 0, "")
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $aRetArr[$aFileReadArr[0]+1][2], $iUbound, $iSplitPos, $sKey, $sValue
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFileReadArr[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aFileReadArr[$i], "^\s*\[\Q" & $sSection & "\E\][\s;]*.*") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $j = $i+1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) $aFileReadArr[0]
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aFileReadArr[$j], "^\s*\[[^\]]+\]\s*") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop) 2
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$iSplitPos = StringInStr (http://www.autoitscript.com/autoit3/docs/functions/StringInStr.htm)($aFileReadArr[$j], "=")
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iSplitPos < 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$iSplitPos = StringLen (http://www.autoitscript.com/autoit3/docs/functions/StringLen.htm)($aFileReadArr[$j]) + 1
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$sKey = StringLeft (http://www.autoitscript.com/autoit3/docs/functions/StringLeft.htm)($aFileReadArr[$j], $iSplitPos-1)
$sValue = StringTrimLeft (http://www.autoitscript.com/autoit3/docs/functions/StringTrimLeft.htm)($aFileReadArr[$j], $iSplitPos)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $sKey = "" Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iSplitPos = 0 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sValue = ""
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) $iReadMode <= 0 Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) IsNumber (http://www.autoitscript.com/autoit3/docs/functions/IsNumber.htm)($iReadMode) Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aFileReadArr[$j], "\A[^;].*=.*$") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Else (http://www.autoitscript.com/autoit3/docs/keywords.htm#Else)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($iReadMode, 1) = 1 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aFileReadArr[$j], "\A(\s+|);") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($iReadMode, 8) = 8 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) ($sValue = "" Or (http://www.autoitscript.com/autoit3/docs/keywords.htm#Or) $sValue = $aFileReadArr[$j]) And (http://www.autoitscript.com/autoit3/docs/keywords.htm#And) Not (http://www.autoitscript.com/autoit3/docs/keywords.htm#Not) StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($aFileReadArr[$j], "\A(\s+|);") Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
ContinueLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ContinueLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
If (http://www.autoitscript.com/autoit3/docs/keywords.htm#If) BitAND (http://www.autoitscript.com/autoit3/docs/functions/BitAND.htm)($iReadMode, 16) = 16 Then (http://www.autoitscript.com/autoit3/docs/keywords.htm#Then)
$sValue = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sValue, ";.*?$", "")
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
$aRetArr[0][0] += 1
$aRetArr[$aRetArr[0][0]][0] = $sKey
$aRetArr[$aRetArr[0][0]][1] = $sValue
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
ExitLoop (http://www.autoitscript.com/autoit3/docs/keywords.htm#ExitLoop)
EndIf (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndIf)
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
ReDim (http://www.autoitscript.com/autoit3/docs/keywords.htm#ReDim) $aRetArr[$aRetArr[0][0]+1][2]
Return (http://www.autoitscript.com/autoit3/docs/keywords.htm#Return) $aRetArr
EndFunc (http://www.autoitscript.com/autoit3/docs/keywords.htm#EndFunc)
:)
Creat0R, спасибо большое! То, что нужно)
Creat0R, Огромнейшее спасибо !
-TRM-,
IniVirtual (http://www.autoitscript.com/forum/topic/147373-inivirtual/) (AZJIO)
IniEx (http://www.autoitscript.com/forum/topic/156502-ini-file-processing-functions/) (DXRW4E)
IniString (http://www.autoitscript.com/forum/topic/72690-inistring-functions-was-ini-inmem/) (ResNullius & MrCreatoR (G.Sandler))
тема обсуждения (http://www.autoitscript.com/forum/topic/32004-iniex-functions-exceed-32kb-limit/) на официальном сайте.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.