Первая попытка самостоятельно прочитать/разобрать ini файл
EnableExplicit
Structure KeyVal
Key.s
Value.s
EndStructure
Structure Group
List KeyVal.KeyVal()
EndStructure
NewMap virtini.Group()
Procedure Read_INI(Map virtini.Group(), Path$)
Protected tmp, tmp$, StrN$
Protected id, Pos
Protected NotGrOpen = 1
If FileSize(Path$) > 4
id = ReadFile(#PB_Any, Path$)
If id
While Eof(id) = 0
StrN$ = ReadString(id)
StrN$ = RTrim(StrN$, " ")
Repeat ; цикл удаления пробельных символов в начале строки
tmp = Asc(StrN$)
Select tmp
Case 32, 9, 160
StrN$ = LTrim(StrN$, Chr(tmp))
Default
Break
EndSelect
ForEver
If Asc(StrN$) = 59 ; Если комментарий то читаем следующую строку
Continue
EndIf
If Asc(StrN$) = 91 ; Если открывается группа, то читаем её имя
Pos = FindString(StrN$, "]", 3, #PB_String_CaseSensitive)
If Pos And AddMapElement(virtini(), Mid(StrN$, 2, Pos - 2), #PB_Map_NoElementCheck) ; добавляем элемент карты, потом элемент списка
NotGrOpen = 0
EndIf
Continue
EndIf
If NotGrOpen ; Если нет открытой группы, то пропускаем текущую строку, до тех пор пока не будет открыта, т.к. параметры и значения могут быть только в группе
Continue
EndIf
Pos = FindString(StrN$, "=", 2, #PB_String_CaseSensitive)
If Pos
If AddElement(virtini()\KeyVal())
virtini()\KeyVal()\Key = Left(StrN$, Pos - 1)
virtini()\KeyVal()\Value = Mid(StrN$, Pos + 1)
EndIf
ElseIf Asc(StrN$) And AddElement(virtini()\KeyVal())
virtini()\KeyVal()\Key = StrN$
EndIf
Wend
CloseFile(id)
EndIf
EndIf
EndProcedure
Read_INI(virtini(), "C:\desktop-файлы\shutter.desktop")
ForEach virtini()
Debug #CRLF$ + "[" + MapKey(virtini()) + "]"
ForEach virtini()\KeyVal()
Debug virtini()\KeyVal()\Key + " = " + virtini()\KeyVal()\Value
Next
Next
полное использование Карты
EnableExplicit
Structure Group
Map KeyVal.s()
EndStructure
NewMap virtini.Group()
Procedure Read_INI(Map virtini.Group(), Path$)
Protected tmp, tmp$, StrN$
Protected id, Pos
Protected NotGrOpen = 1
If FileSize(Path$) > 4
id = ReadFile(#PB_Any, Path$)
If id
While Eof(id) = 0
StrN$ = ReadString(id)
StrN$ = RTrim(StrN$, " ")
Repeat ; цикл удаления пробельных символов в начале строки
tmp = Asc(StrN$)
Select tmp
Case 32, 9, 160
StrN$ = LTrim(StrN$, Chr(tmp))
Default
Break
EndSelect
ForEver
If Asc(StrN$) = 59 ; Если комментарий то читаем следующую строку
Continue
EndIf
If Asc(StrN$) = 91 ; Если открывается группа, то читаем её имя
Pos = FindString(StrN$, "]", 3, #PB_String_CaseSensitive)
If Pos And AddMapElement(virtini(), Mid(StrN$, 2, Pos - 2), #PB_Map_NoElementCheck) ; добавляем элемент карты, потом элемент списка
NotGrOpen = 0
EndIf
Continue
EndIf
If NotGrOpen ; Если нет открытой группы, то пропускаем текущую строку, до тех пор пока не будет открыта, т.к. параметры и значения могут быть только в группе
Continue
EndIf
Pos = FindString(StrN$, "=", 2, #PB_String_CaseSensitive)
If Pos
tmp$ = Left(StrN$, Pos - 1)
tmp$ = RTrim(tmp$, " ") ; удаляем пробелы вокруг "="
If AddMapElement(virtini()\KeyVal(), tmp$, #PB_Map_NoElementCheck)
tmp$ = Mid(StrN$, Pos + 1)
tmp$ = LTrim(tmp$, " ") ; удаляем пробелы вокруг "="
virtini()\KeyVal() = tmp$
EndIf
ElseIf Asc(StrN$)
AddMapElement(virtini()\KeyVal(), StrN$, #PB_Map_NoElementCheck)
EndIf
Wend
CloseFile(id)
EndIf
EndIf
EndProcedure
Read_INI(virtini(), "C:\shutter.desktop")
ForEach virtini()
Debug #CRLF$ + "[" + MapKey(virtini()) + "]"
ForEach virtini()\KeyVal()
Debug MapKey(virtini()\KeyVal()) + " = " + virtini()\KeyVal()
Next
Next
; Доступ к значению по имени Секция + Ключ
MessageRequester("", virtini("Desktop Action Screen")\KeyVal("Exec"))
Отредактировано AZJIO (15.08.2021 17:39:16)