Hi!
Ich habe für ein Projekt mal eine ziemlich komplizierte Funktion für .ini-Dateien geschrieben, bevor ich drauf kam, die aufzudröseln. Das habe ich jetzt gemacht und dachte, andere könnten das auch gebrauchen. Falls nicht schon jemand eine bessere Variante geschrieben hat, könnt ihr sie (Einige könnten überflüssig oder komplizierter sein) gerne unter Verweis auf mich -Quellcode reicht - benutzen. Hier die Beschreibung der wichtigsten Funktionen:
_IniFindKey(): Sucht übereinstimmenden Key in der ini-Datei und gibt die zugehörigen Daten in einem Array zurück.
_IniFindValue(): Sucht übereinstimmenden Value in der ini-Datei und gibt die zugehörigen Daten in einem Array zurück.
_IniInsertSection(): Fügt eine Section an der angegebenen Stelle ein.
_IniInsertKey(): Fügt einen Key und Value an der angegebenen Stelle in der Section ein.
_IniSortAll(): Sortiert alle Einträge in der ini-Datei.
_IniSortSections(): Sortiert alle Sections in der ini-Datei.
_IniSortSectionKeys(): Sortiert alle Keys einer Section.
_IniKeySectionSwap(): Verschiebt einen Key zwischen Sections.
Hier die UDF:
Spoiler anzeigen
;===============================================================================
;
; Function Name:_IniExists($sFile)
; Description: Prüft, ob eine ini-Datei besteht
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniExists($sFile)
If Not FileExists($sFile) Or StringRight($sFile, 4) <> ".ini" Then
Return 0
Else
Return 1
EndIf
EndFunc
;===============================================================================
;
; Function Name:_IniSectionExists($sFile, $sIniSection)
; Description: Prüft, ob eine bestimmte Section in der ini-Datei besteht
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection ist die gesuchte Section.
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniSectionExists($sFile, $sIniSection)
IniReadSection($sFile, $sIniSection)
If @error Then Return 0
Return 1
EndFunc
;===============================================================================
;
; Function Name:_IniKeyExists($sFile, $sIniSection, $sIniKey)
; Description: Prüft, ob ein bestimmter Key in der ini-Datei besteht
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection ist die Section des gesuchten Keys.
;$sIniKey ist der gesuchte Key.
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniKeyExists($sFile, $sIniSection, $sIniKey)
$var = IniRead($sFile, $sIniSection, $sIniKey, "error")
If $var = "error" Then Return 0
Return 1
EndFunc
;===============================================================================
;
; Function Name:_IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
; Description: Prüft, ob ein bestimmter Value in der ini-Datei besteht
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection ist die Section des gesuchten Keys.
;$sIniKey ist der Key des gesuchten Values.
;$sIniValue ist der gesuchte Value.
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniValueExists($sFile, $sIniSection, $sIniKey, $sIniValue)
$var = IniRead($sFile, $sIniSection, $sIniKey, "error")
If $var = $sIniValue Then Return 1
Return 0
EndFunc
;===============================================================================
;
; Function Name:_IniFindKey($sFile, $sIniKey, [$fStrInStr])
; Description: Sucht übereinstimmenden Key in der ini-Datei und gibt die
;zugehörigen Daten in einem Array zurück.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniKey ist der gesuchte Key.
;$fStrInStr gibt an, ob
;0 = $sIniKey ist der vollständige gesuchte Key (Default)
;1 = $sIniKey ist eine Teilzeichenkette des gesuchten Keys
; Return Value(s): Erfolg - Gibt ein Array zurück, das die Sections und Values aller
;übereinstimmenden Daten enthält.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
; Remarks:
; $Array[0][0] enthält die Anzahl der gefundenen Keys. $Array[1][0] enthält die Section
; des ersten gefundenen Keys, $Array[1][1] enthält den Value des ersten gefundenen Keys.
; $Array[n][0] und $Array[n][1] enthalten die entsprechenden Daten der folgenden gefundenen
; Keys.
; Ist $fStrInStr gleich 1, enthält $Array[1][2] den vollständigen Name des gefundenen Keys,
; $Array[n][2] die entsprechenden vollständigen Namen der weiteren gefundenen Keys.
;
;===============================================================================
Func _IniFindKey($sFile, $sIniKey, $fStrInStr=0)
Dim $aArray[1][1]
$aArray[0][0] = 0
Local $aSections = IniReadSectionNames($sFile)
If @error Then Return 0 ;Keine Datei gefunden
For $i_sec = 1 To $aSections[0] ;Schleife der Sections
Local $aKeys = IniReadSection($sFile, $aSections[$i_sec])
For $i_key = 1 To $aKeys[0][0] ;Schleife der Keys
If $fStrInStr = 0 And $aKeys[$i_key][0] = $sIniKey Then ;Nicht case-sensitive
$aArray[0][0] += 1 ;Setzt den Counter für das Array
ReDim $aArray[$aArray[0][0]+1][2]
$aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Counter für die Section
$aArray[$aArray[0][0]][1] = $aKeys[$i_key][1] ;Setzt den Counter für den Value
ElseIf $fStrInStr = 1 And StringInStr($aKeys[$i_key][0], $sIniKey) Then ;Nicht case-sensitive
$aArray[0][0] += 1 ;Setzt den Counter für das Array
ReDim $aArray[$aArray[0][0]+1][3] ;TODO: Ist das +2 wirklich richtig?
$aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Counter für die Section
$aArray[$aArray[0][0]][1] = $aKeys[$i_key][1] ;Setzt den Counter für den Value
$aArray[$aArray[0][0]][2] = $aKeys[$i_key][0] ;Setzt den Wert für den kompletten Key
EndIf
Next
Next
If $aArray[0][0] = 0 Then Return 0
If $aArray[0][0] > 0 Then Return $aArray
EndFunc
;===============================================================================
;
; Function Name: _IniFindValue($sFile, $sIniValue, [$fStrInStr])
; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
;zugehörigen Daten in einem Array zurück.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniValue ist der gesuchte Value.
;$fStrInStr gibt an, ob
;0 = $sIniKey ist der vollständige gesuchte Key (Default)
;1 = $sIniKey ist eine Teilzeichenkette des gesuchten Keys
; Return Value(s): Erfolg - Gibt ein Array zurück, das die Sections und Keys aller
;übereinstimmenden Daten enthält.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
; Remarks:
; $Array[0][0] enthält die Anzahl der gefundenen Values. $Array[1][0] enthält die Section
; des ersten gefundenen Values, $Array[1][1] enthält den Key des ersten gefundenen Values.
; $Array[n][0] und $Array[n][1] enthalten die entsprechenden Daten der folgenden gefundenen
; Values.
; Ist $fStrInStr gleich 1, enthält $Array[1][2] den vollständigen Name des gefundenen Values,
; $Array[n][2] die entsprechenden vollständigen Namen der weiteren gefundenen Values.
;
;===============================================================================
Func _IniFindValue($sFile, $sIniValue, $fStrInStr=0)
Dim $aArray[1][1]
$aArray[0][0] = 0
Local $aSections = IniReadSectionNames($sFile)
If @error Then Return 0 ;Keine Datei gefunden
For $i_sec = 1 To $aSections[0] ;Schleife der Sections
Local $aKeys = IniReadSection($sFile, $aSections[$i_sec])
For $i_key = 1 To $aKeys[0][0] ;Schleife der Keys
If $fStrInStr = 0 And $aKeys[$i_key][1] = $sIniValue Then ;Nicht case-sensitive
$aArray[0][0] += 1 ;Setzt den Counter für das Array
ReDim $aArray[$aArray[0][0]+1][2]
$aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Wert für die Section
$aArray[$aArray[0][0]][1] = $aKeys[$i_key][0] ;Setzt den Wert für den Key
ElseIf $fStrInStr = 1 And StringInStr($aKeys[$i_key][1], $sIniValue) Then ;Nicht case-sensitive
$aArray[0][0] += 1 ;Setzt den Counter für das Array
ReDim $aArray[$aArray[0][0]+1][3] ;TODO: Ist das +2 wirklich richtig?
$aArray[$aArray[0][0]][0] = $aSections[$i_sec] ;Setzt den Wert für die Section
$aArray[$aArray[0][0]][1] = $aKeys[$i_key][0] ;Setzt den Wert für den Key
$aArray[$aArray[0][0]][2] = $aKeys[$i_key][1] ;Setzt den Wert für den kompletten Value
EndIf
Next
Next
If $aArray[0][0] = 0 Then Return 0
If $aArray[0][0] > 0 Then Return $aArray
EndFunc
;===============================================================================
;
; Function Name: _IniInsertSection($sFile, $sIniSection, $sData, $nIndex)
; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
;zugehörigen Daten in einem Array zurück.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection ist die einzufügende Section
;$sIniData ist der Datenbestand der einzufügenden Section.
;$sIniIndex die Position innerhalb der ini-Datei, an der die
;Section eingefügt werden soll (Index beginnt bei 1).
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück und setzt @error.
;@error=1 Ini-Datei nicht vorhanden
;@error=2 Section existiert bereits
;@error=3 Falscher Index
; Author(s): unearth
; Remarks:
; Sollen mit $sData mehr als ein Key eingegeben werden, müssen die Keys mit
; @LF getrennt werden
;
;===============================================================================
Func _IniInsertSection($sFile, $sIniSection, $sData, $nIndex)
Local $aSections = IniReadSectionNames($sFile)
If @error Then Return 0
If Not _IniExists($sFile) Then
SetError(1) ;@error=1 Ini-Datei nicht vorhanden
Return 0
EndIf
If _IniSectionExists($sFile, $sIniSection) Then
SetError(2) ;@error=2 Section existiert bereits
Return 0
EndIf
If $nIndex < 0 Or $nIndex > $aSections[0] Then
SetError(3) ;@error=3 Falscher Index
Return 0
EndIf
IniWriteSection($sFile, $sIniSection, $sData) ;Hängt die neue Section zunächst hinten an
For $i = $nIndex To $aSections[0] ;Löscht die Sections, die später unter der eingefügten Section liegen sollen. Hängt sie dann der Reihe nach wieder an.
Local $aKeys = IniReadSection($sFile, $aSections[$i])
IniDelete($sFile, $aSections[$i])
For $i_key = 1 To $aKeys[0][0]
IniWrite($sFile, $aSections[$i], $aKeys[$i_key][0],$aKeys[$i_key][1])
Next
Next
Return 1
EndFunc
;===============================================================================
;
; Function Name: _IniInsertKey($sFile, $sIniSection, $sIniKey, $sIniValue, $nIndex)
; Description: Sucht übereinstimmenden Value in der ini-Datei und gibt die
;zugehörigen Daten in einem Array zurück.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection ist die einzufügende Section
;$sIniKey ist der einzufügende Key.
;$sIniValue ist der Value des einzufügenden Keys.
;$sIniIndex die Position innerhalb der ini-Datei, an der der
;Key eingefügt werden soll (Index beginnt bei 1).
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück und setzt @error.
;@error=1 Ini-Datei nicht vorhanden
;@error=2 Section existiert bereits
;@error=3 Key existiert bereits
;@error=4 Falscher Index
; Author(s): unearth
;
;===============================================================================
Func _IniInsertKey($sFile, $sIniSection, $sIniKey, $sIniValue, $nIndex)
Local $aArrayVec1
Local $aArrayVec2
$aKeys = IniReadSection($sFile, $sIniSection)
If @error Then Return 0
If Not _IniExists($sFile) Then
SetError(1) ;@error=1 Ini-Datei nicht vorhanden
Return 0
EndIf
If Not _IniSectionExists($sFile, $sIniSection) Then
SetError(2) ;@error=2 Section nicht vorhanden
Return 0
EndIf
If _IniKeyExists($sFile, $sIniSection, $sIniKey) Then
SetError(3) ;@error=3 Key existiert bereits
Return 0
EndIf
If $nIndex < 0 Or $nIndex > $aKeys[0][0] Then
SetError(4) ;@error=4 Falscher Index
Return 0
EndIf
For $i = 1 To $aKeys[0][0] ;Löscht die bisherigen Werte in der Section
IniDelete($sFile, $sIniSection, $aKeys[$i][0])
Next
Dim $aArrayVec1[$aKeys[0][0]+1] ;Den ersten Vektor von §aKeys als eigenständiges Array erstellen = Enthält die Keys
$aArrayVec1[0] = $aKeys[0][0]+1
For $i = 1 To $aKeys[0][0]
$aArrayVec1[$i] = $aKeys[$i][0]
Next
Dim $aArrayVec2[$aKeys[0][0]+1] ;Den zweiten Vektor von §aKeys als eigenständiges Array erstellen = Enthält die Values
$aArrayVec2[0] = $aKeys[0][0]+1
For $i = 1 To $aKeys[0][0]
$aArrayVec2[$i] = $aKeys[$i][1]
Next
_ArrayInsert($aArrayVec1, $nIndex, $sIniKey)
_ArrayInsert($aArrayVec2, $nIndex, $sIniValue)
$aKeys = "" ;Hebt das ursprüngliche Array auf, um es neu erstellen zu können
Dim $aKeys[$aArrayVec1[0]+1][$aArrayVec2[0]+1] ;Erstellt das Array mit dem eingefügten Key und dessen Value neu
$aKeys[0][0] = $aArrayVec1[0]
For $i = 1 To $aKeys[0][0]
$aKeys[$i][0] = $aArrayVec1[$i]
$aKeys[$i][1] = $aArrayVec2[$i]
Next
For $i = 1 To $aKeys[0][0] ;Schreibt die neuen Daten in die Section
IniWrite($sFile, $sIniSection, $aKeys[$i][0], $aKeys[$i][1])
Next
Return 1
EndFunc
;===============================================================================
;
; Function Name: _IniSortAll($sFile, $fDescendingSections, $fDescendingKeys)
; Description: Sortiert alle Einträge in der ini-Datei.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$fDescendingSections gibt an, ob
;0 = Sections werden aufsteigend sortiert(Default)
;1 = Sections werden absteigend sortiert
;$fDescendingKeys gibt an, ob
;0 = Keys werden aufsteigend sortiert(Default)
;1 = Keys werden absteigend sortiert
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniSortAll($sFile, $fDescendingSections=0, $fDescendingKeys=0)
;Ist die Integrität gestört, werden Daten eventuell gelöscht
If _IniSortSections($sFile, $fDescendingSections) = 0 Then Return 0
Local $aSections = IniReadSectionNames($sFile)
For $i_sec = 1 To $aSections[0]
If _IniSortSectionKeys($sFile, $aSections[$i_sec], $fDescendingKeys) = 0 Then Return 0
Next
Return 1
EndFunc
;===============================================================================
;
; Function Name: _IniSortSections($sFile, $fDescending)
; Description: Sortiert alle Sections in der ini-Datei.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$fDescending gibt an, ob
;0 = Sections werden aufsteigend sortiert(Default)
;1 = Sections werden absteigend sortiert
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniSortSections($sFile, $fDescending=0)
;Ist die Integrität der INI gestört, werden Daten eventuell gelöscht
If $fDescending > 1 Then $fDescending = 1
If $fDescending < 1 Then $fDescending = 0
Local $aSections = IniReadSectionNames($sFile)
If @error Then Return 0
_ArraySort($aSections, $fDescending, 1) ;Sortiert die Sections
For $i_sec = 1 To $aSections[0] ;Schreibt die Sections um
$aKeys = IniReadSection($sFile, $aSections[$i_sec])
IniDelete($sFile, $aSections[$i_sec]) ;Alte Position löschen
For $i_key = 1 To $aKeys[0][0]
IniWrite($sFile, $aSections[$i_sec], $aKeys[$i_key][0],$aKeys[$i_key][1]) ;Neue Position schreiben
Next
Next
Return 1
EndFunc
;===============================================================================
;
; Function Name: _IniSortSectionKeys($sFile, $sIniSection, $fDescending)
; Description: Sortiert alle Keys einer Section.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniSection gibt an, in welcher Section die Keys sortiert werden.
;$fDescending gibt an, ob
;0 = Keys werden aufsteigend sortiert(Default)
;1 = Keys werden absteigend sortiert
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniSortSectionKeys($sFile, $sIniSection, $fDescending=0)
;Ist die Integrität der INI gestört, werden Daten eventuell gelöscht
Local $aKeys
If $fDescending > 1 Then $fDescending = 1
If $fDescending < 1 Then $fDescending = 0
$aKeys = IniReadSection($sFile, $sIniSection)
If @error Then Return 0
For $i_key = 1 To $aKeys[0][0]
IniDelete($sFile, $sIniSection, $aKeys[$i_key][0])
Next
_ArraySort($aKeys, $fDescending, 1, 0, 2) ;Sortieren
For $i_key = 1 To $aKeys[0][0]
IniWrite($sFile, $sIniSection, $aKeys[$i_key][0], $aKeys[$i_key][1])
Next
Return 1
EndFunc
;===============================================================================
;
; Function Name: _IniKeySectionSwap($sFile, $sIniKey, $sIniSection1, $sIniSection2)
; Description: Verschiebt einen Key zwischen Sections.
; Parameter(s): $sFile ist der Pfad zur ini-Datei.
;$sIniKey gibt den zu verschiebenden Key an.
;$sIniSection1 gibt die aktuelle Section des Keys an.
;$sIniSection2 gibt die zukünftige Section des Keys an.
; Return Value(s): Erfolg - Gibt 1 zurück.
; Fehler - Gibt 0 zurück.
; Author(s): unearth
;
;===============================================================================
Func _IniKeySectionSwap($sFile, $sIniKey, $sIniSection1, $sIniSection2)
;TODO = Später noch um _IniKeyInsert-Funktion mit Indexierung ergänzen?
If Not _IniExists($sFile) Or Not _IniKeyExists($sFile, $sIniSection1, $sIniKey) Or Not _IniSectionExists($sFile, $sIniSection2) Then Return 0 ;Prüft, ob die Voraussetzungen bestehen
$sIniValue = IniRead($sFile, $sIniSection1, $sIniKey, "error")
If @error Then Return 0
IniDelete($sFile, $sIniSection1, $sIniKey)
IniWrite($sFile, $sIniSection2, $sIniKey, $sIniValue) ;siehe TODO
Return 1
EndFunc
Im Anhang eine Zip mit ini-Datei zum Testen. Falls Fehler drin sind - Feedback willkommen.
Grüße unearth