Windows INI-Datei lesen

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Windows INI-Datei lesen

Beitrag von Niels »

Ich möchte aus einer INI-Datei im Windows-Style die Variablen einer Sektion auslesen. Gibt es dafür Methoden um dies ohne riesigen Aufwand zu lösen (wie bei MS-Basic GetProfileString)? Und sicher gibt es auch eine Systemvariable für den Windows-Pfad - oder?

Gruß
Niels
Toxitom
********
Beiträge: 3768
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Niels,
Gibt es dafür Methoden um dies ohne riesigen Aufwand zu lösen (wie bei MS-Basic GetProfileString)?
Nicht direkt. Hier musst du schon die Datei öffnen, zeilenweise einlesen und nach der entsprechenden Stelle suchen.
Und sicher gibt es auch eine Systemvariable für den Windows-Pfad - oder?
Hier sollte dir die Funktion Environ ("Path") weiterhelfen. Hängt aber vom Betriebssystem ab. Die Hilfe gibt Auskunft über die exakte Sysntax.

Gruss
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Danke

Beitrag von Niels »

Toxitom hat geschrieben:Hier sollte dir die Funktion Environ ("Path") weiterhelfen. Hängt aber vom Betriebssystem ab. Die Hilfe gibt Auskunft über die exakte Sysntax.
Die Path-variable hilft da nicht so, aber der Environ-Tipp war ausgezeichnet, msgbox Environ ("WinDir") bringt das gewünschte Ergebnis.

Gruß
Niels
Niels
*****
Beiträge: 212
Registriert: Mi, 16.06.2004 06:46
Wohnort: Heikendorf

Lösung

Beitrag von Niels »

So, hier kommt für das Protokoll meine Lösung. Vielleicht kann der Eine oder Andere das ja mal gebrauchen.
Das Makro liest den kompletten Inhalt der Sektion in ein Array ein, eine Spalte mit Parameternamen und eine mit Parameterwert. Das war für mich das Beste, da ich sowieso danach mit den Parameternamen rumjongliere, aber auch ansonsten ist die Lösung ja nicht schlimm, denn im Array ist man ja bei der Suche fix unterwegs.
Hier nun der Code:


Sub IniLesen

' Variablendeklaration:
'-----------------------
dim WinDir as String 'Windows Systemverzeichnis
dim DateiNr as Integer 'Dateinummer für einen freien Dateikanal
dim Zeile as String 'Variable für die aktuell aus der Datei eingelesenen Zeile
dim Position as Integer 'Positionsangabe für die Suche nach Elementen zur Zeilenzerlegung
dim Werte(0,1) as String 'Array für die aus der Ini eingelesenen Werte (1. Element(0) = Name , 2. Element(1) = Wert)
dim W_Anzahl as Integer 'Zähler für die Werteanzahl, die eingelesen wurde
dim i as integer 'die berühmte Zählvariable i

'Initialiserung
'----------------------------------------
WinDir = Environ ("WinDir") 'das Eindows-Verzeichnis wird ermittelt
W_Anzahl = 0 'Die Anzahl der eingelesenen Werte ist momentan ja noch nicht groß

'Jetzt geht es los, ich versuche die Daten einzulesen und muss diese dazu erst einmal öffnen:
'--------------------------------------------------------------------------------------------
DateiNr = freefile 'freie Dateinummer ermitteln
On Error GoTo Fehler 'Fehler führen hiermit zum Abbruch (zum Debuggen auskommentieren)
Open WinDir & "\meine.ini" for input as DateiNr 'INI öffnen

'Nun muss die relevante Sektion gefunden werden:
'-----------------------------------------------
do
Line Input #DateiNr, Zeile
Position = Instr (Zeile, "[Sektionsname]")
loop until Position > 0

'Wenn ich nicht mit EOF abgeflogen bin, geht es hier weiter

'Nun werden die Werte und Wertenamen extrahiert und in das Datenarray übernommen
'-------------------------------------------------------------------------------
do 'dazu ist eine Schleife die beste Wahl der Waffen
Line Input #DateiNr, Zeile 'es wird die nächste Zeile eingelesen
Position = Instr (Zeile, "=") 'und die Position des Zeichens = ermittelt
if Position > 0 then 'dann wurde das Zeichen gefunden
Werte (W_Anzahl,0) = mid(Zeile, 1, Position - 1) 'und es kann der Parametername in das Array übernommen werden
Werte (W_Anzahl,1) = mid(Zeile, Position + 1, len(Zeile) 'dazu kommt jetzt noch der Parameterwert in´s Array
W_Anzahl = W_Anzahl + 1 'Wertezähler hoch
ReDim Preserve Werte(W_Anzahl,1) 'Array vergrößern
else 'ansonsten könnte es sein, dass eine fehlerhafte Zeile vorgekommen ist, oder die nächste sektion beginnt
Position = Instr (Zeile, "[") + Instr (Zeile, "]") 'daher prüfe ich mal, ob die beien markanten Zeichen für eine neue Sektion vorkommen
if Position > 1 then exit Do 'dann beginnt vermutlich eine neue Sektion und das Einlesen ist beendet
end if
loop until EOF(DateiNr) 'wenn keine neue Sektion kommt, dann geht es bis zum Dateiende weiter
Close #DateiNr 'die Datei brauche ich jetzt nicht mehr, ich habe alles im Array

Exit Sub 'Hier ist Ende, das Fehlerhandling braucht ja nun nicht mehr durchlaufen werden

Fehler:
On Error resume next
Close #DateiNr 'Falls der Fehler erst nach dem Öffnen aufgetreten ist
MsgBox "Es ist ein Fehler bei der Datenübernahme aufgetreten!"
End Sub
Antworten