Первая попытка самостоятельно прочитать/разобрать 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)