Что нового

Вернуть названия имеющихся разделов стандартного .ini файла

vovsla

Осваивающий
Сообщения
607
Репутация
36
Стандартная функция IniReadSectionNames ( "filename" ) возвращает только чуть более 6 тысяч первых разделов, есть ли библиотечная функция которая возвращает все разделы?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Только, если ты сам такую напишешь. А что, ты уже столкнулся с подобным ограничением?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vovsla [?]
возвращает только чуть более 6 тысяч первых разделов
А точнее, ограничивается в 32kb на секцию. В справке об этом кажется пишется.

Обойти это можно собственной функцией, я использую такую:

Код:
Func _IniReadSectionEx($sIniFile, $sSection, $iReadMode=-1)
	Local $aFileReadArr = StringSplit(StringStripCR(FileRead($sIniFile)), @LF)
	If @error Then Return SetError(1, 0, "")
	
	Local $aRetArr[$aFileReadArr[0]+1][2], $iUbound, $iSplitPos, $sKey, $sValue
	
	For $i = 1 To $aFileReadArr[0]
		If $aFileReadArr[$i] = "[" & $sSection & "]" Then
			For $j = $i+1 To $aFileReadArr[0]
				If StringLeft($aFileReadArr[$j], 1) = "[" Then ExitLoop 2
				
				$iSplitPos = StringInStr($aFileReadArr[$j], "=")
				If $iSplitPos < 1 Then $iSplitPos = StringLen($aFileReadArr[$j]) + 1
				
				$sKey = StringLeft($aFileReadArr[$j], $iSplitPos-1)
				$sValue = StringTrimLeft($aFileReadArr[$j], $iSplitPos)
				
				If $sKey = "" Then ContinueLoop
				If $iSplitPos = 0 Then $sValue = ""
				
				Switch $iReadMode
					Case 1 ;Do not read comments
						If StringRegExp($aFileReadArr[$j], "\A(\s+|);") Then ContinueLoop
					Case 2 ;Do not read keys without values but read the comments
						If ($sValue = "" Or $sValue = $aFileReadArr[$j]) And _
							Not StringRegExp($aFileReadArr[$j], "\A(\s+|);") Then ContinueLoop
					Case 3 ;Do not read all except the lines with key=value (as default behaviour of IniReadSection)
						If Not StringRegExp($aFileReadArr[$j], "\A.*=.*$") Then ContinueLoop
				EndSwitch
				
				$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


Которая кстати имеет куда больше возможностей обычной функций. Позже выложу как полезняшку.


Добавлено:
Сообщение автоматически объединено:

Упс, речь идёт о «IniReadSectionNames»...

Тогда так:

Код:
Func _IniReadSectionNamesEx($sIniFile)
	Local $aFileReadArr = StringSplit(StringStripCR(FileRead($sIniFile)), @LF)
	If @error Then Return SetError(1, 0, "")
	
	Local $aRetArr[$aFileReadArr[0]+1], $iUbound, $iSplitPos, $sKey, $sValue
	
	For $i = 1 To $aFileReadArr[0]
		If StringLeft($aFileReadArr[$i], 1) = "[" And StringRight($aFileReadArr[$i], 1) = "]" Then
			$aRetArr[0] += 1
			$aRetArr[$aRetArr[0]] = StringMid($aFileReadArr[$i], 2, StringLen($aFileReadArr[$i])-2)
		EndIf
	Next
	
	ReDim $aRetArr[$aRetArr[0]+1]
	Return $aRetArr
EndFunc
 
Верх