Auch wenn INI-Dateien etwas aus der Mode gekommen sind, ist es durchaus legitim mit Ihnen zu arbeiten und Informationen darin zu speichern. Um dies ohne größere Probleme zu tun, habe ich eine Klasse in C# geschrieben, deren Anwendung ich in diesem Artikel erklären möchte.
Inhaltsverzeichnis
Klasse herunterladen und einbinden
Als Erstes ist es notwendig die Klasse herunterzuladen. Bitte beachte, dass die Klasse unter der MIT-Lizenz von mir veröffentlicht wurde. Das räumt dir aber weitreichende Rechte in der Benutzung ein.
Nachdem das heruntergeladene ZIP-Paket entpackt ist, kann die Klasse in einem Visual Studio Projekt eingebunden werden.

Anschließend wird die Klasse 'INIFile' im Projektmappen-Explorer angezeigt:

Namespace einbinden
Um mit der Klasse arbeiten zu können, muss in der Klasse, in der wir mit 'INIFile' arbeiten möchten, der Namespace 'Nocksoft.IO.ConfigFiles' eingebunden werden. Dafür ist folgender Code bei den using-Direktiven hinzuzufügen:
using Nocksoft.IO.ConfigFiles;
Objekt der Klasse 'INIFile' erzeugen
Jetzt kann eine neue Instanz der Klasse 'INIFile' erzeugt werden. Ich nenne das Objekt 'iniFile'. Als Parameter erwartet der Konstruktor der Klasse 'INIFile' die Pfadangabe der INI-Datei, in der wir lesen oder schreiben wollen. Dafür eignet sich an gewünschter Stelle folgender Code:
INIFile iniFile = new INIFile("settings.ini");
Jetzt stehen mehrere Methoden zur Verfügung. Die wichtigsten Methoden sind 'GetValue()' und 'SetValue()'. Denn mit diesen können Werte aus der INI-Datei gelesen bzw. in diese hineingeschrieben werden.
Methode 'GetValue()'
Mit 'GetValue()' lässt sich ein Wert auslesen. Dazu muss angegeben werden, in welcher Sektion und zu welchem Schlüssel der Wert gehört. Ein Aufruf sieht dann beispielsweise so aus:
string value = iniFile.GetValue("section", "key");
Als optionalen Parameter kann der Methode noch ein Wahrheitswert übergeben werden. Wird 'true' übergeben, wird der Rückgabewert in Kleinbuchstaben konvertiert. Dadurch ist das Programm unempfindlich gegen Groß- und Kleinschreibung. Der Defaultwert ist an dieser Stelle 'false'.
Methode 'SetValue()'
Um einen Wert in die INI-Datei zu schreiben oder zu ändern, eignet sich die Methode 'SetValue()'. Auch dieser Methode sind die Parameter 'section' und 'key' zu übergeben. Als dritten Parameter erwartet die Methode noch einen String, der in die INI-Datei geschrieben werden soll. Wenn die Sektion oder der Schlüssel nicht vorhanden sind, werden diese in der INI-Datei angelegt. Genau wie bei 'GetValue()' kann hier wieder optional ein Wahrheitswert übergeben werden. Wird 'true' übergeben, wird der Wert in Kleinbuchstaben abgespeichert. Der Defaultwert ist an dieser Stelle ebenfalls 'false'. Hier ein Beispiel des Aufrufs:
iniFile.SetValue("section", "key", "value");
Methode 'GetSection()'
Die Methode 'GetSection()' gibt den gesamten Inhalt einer Section aus der INI-Datei als Liste zurück. Optional auch mit Kommentaren. Ein Aufruf sieht dann etwa so aus:
List<string> section = iniFile.GetSection("section");
Sollen auch Kommentare aus der INI-Datei mit zurückgegeben werden, ist als zweiter Parameter der Wahrheitswert 'true' zu übergeben.
Fehlerbehandlung
Es kann sein, dass die INI-Datei, die übergeben wird, nicht vorhanden ist. Daher ist es ratsam diesen Fehler mit einer Überprüfung oder einem Try-Catch-Block abzufangen. Dies könnte dann beispielsweise so aussehen:
try
{
INIFile iniFile = new INIFile("settings.ini");
string value = iniFile.GetValue("section", "key");
iniFile.SetValue("section", "key", "value");
}
catch(System.IO.FileNotFoundException)
{
MessageBox.Show("Datei nicht gefunden.");
}
Kleines Beispielprogramm
Im folgenden Beispiel wird als erstes ein Objekt vom Typ 'INIFile' erzeugt. Mit diesem greife ich auf die Methode 'SetValue()' zu. Es wird in der Sektion 'anwender' für den Schlüssel 'name' der Wert geschrieben, den der Anwender in die TextBox eingegeben hat. Im nächsten Schritt wird dieser Wert wieder aus der INI-Datei gelesen, um ihn in einer MessageBox auszugeben. Der Try-Catch-Block fängt den Fehler ab, dass die INI-Datei nicht vorhanden ist.
using System.Windows;
using Nocksoft.IO.ConfigFiles;
namespace INI_Example
{
/// <summary>
/// Interaktionslogik für MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, RoutedEventArgs e)
{
try
{
// Instanz der Klasse 'INIFile' erzeugen
INIFile iniFile = new INIFile("settings.ini");
// Wert in INI-Datei speichern
iniFile.SetValue("anwender", "name", textBox.Text);
// Wert aus INI-Datei auslesen
string value = iniFile.GetValue("anwender", "name");
MessageBox.Show(value);
}
catch(System.IO.FileNotFoundException)
{
MessageBox.Show("Datei nicht gefunden.");
}
}
}
}
Ich hoffe, die Klasse stößt auf Gefallen und nimmt euch etwas Arbeit ab.
15 Antworten auf „Visual C#: Arbeiten mit INI-Dateien“
Danke.
Genau wonach ich gesucht habe.
Und noch mit einen anfänger freundlichen tutorial.
Perfekt für mich.
Mit .ini dateien komm ich besser klar als mit .xml dateien
Hallo,
zuerst einmal vielen Dank für diese hilfreiche Klasse.
Was mir allerdings noch fehlt ist eine Funktion um Einträge auch wieder zu löschen.
Wie kann ich den Pfad zur Datei im Programm ändern ohne jedes Mal eine neue Klasse anzulegen?
Danke & Viele Grüße
Dominik
Leider gibt es derzeit keine Möglichkeit bestehende Einträge zu entfernen. Aber das ist für die Zukunft geplant.
Nachträglich ist es auch nicht möglich den Pfad zur INI-Datei zu bearbeiten. Es wäre aber möglich, dass ich auch diese Funktion implementieren werde.
Das wäre natürlich super.
Dann wäre diese Klasse auch universal verwendbar.
Grüße
Dominik
///
/// Die Methode ändert den Pfad zur Datei.
///
/// Pfad zur Datei.
public void SelectFile(string file)
{
_File = file;
}
Hat bei mir funktioniert und reicht denke ich völlig aus.
Vielleicht kannst du das ganze hier auch gebrauchen.
Grüße
Dominik
Hey und vielen Dank!
Funktioniert super, aber wie kann ich z.b: alle sections aus der *.ini auslesen und in der combobox anzeigen?
beste Grüße
Hallo Tony,
diese Funktionalität bringt meine INI-Klasse leider noch nicht mit. Aber das wäre sicher eine sinnvolle Idee für die Zukunft.
Viele Grüße
Rafael
Moin,
super Classe, hat mir vieles einfach gemacht!
Frage, ich würde gerne GetSection verwenden, aber irgendwie stehe ich gerade auf dem Schlauch.
LG
Maurice
Hallo Maurice,
vielen Dank für das Feedback.
Die Methode GetSection() gibt eine Liste "List<string>" zurück, wobei jeder Index eine Zeile aus der Section der INI-Datei darstellt.
Hier ein Beispielaufruf:
var section = iniFile.GetSection("section");
foreach (var item in section)
{
Console.WriteLine(item);
}
Ich arbeite aber gerade auch an einer neuen Version der Klasse INIFile. Wenn diese fertig ist, werde ich die Anleitung hier auch mal etwas aktualisieren.
Liebe Grüße
Rafael
Hey,
großartig, vielen Dank.
LG
Maurice
Super Sache! Einfach und Gut! Danke hat mir sehr geholfen.
ASA/MBA,
grandiose Klasse.
Wir haben die ini noch um die Methode GetSectionList() erweitert.
Und somit ein fantastisches Programm zur Verwaltung von DB's und Queue's erhalten.
Hey, super Klasse.
Habe den Quellcode dankend bei mir mit eingebaut.
Leider bekomme ich Fehler in der .ini , wenn die übergebene Section Leerzeichen enthält.
Soweit ich es beurteilen kann, wird die Section nicht richtig erkannt und somit mehrfach in die .ini geschrieben.
Gibts nen Denkanstoß?
Viele Grüße.
Hallo Frank,
in der Tat gibt es keine einheitliche Konvention was Leerzeichen in INI-Dateien angeht. Ich habe die Klasse auch nicht auf Leerzeichen getestet.
Eventuell werde ich das aber in Zukunft für künftige Versionen der Klasse tun.
Viele Grüße
Rafael
Vielen Dank für den Code
Ich habe jetzt nur das Lesen ausprobiert und scheinbar ignoriert es auch Sonderzeichen wie den Hash-Tag, der in der nicht Standart-INI-Datei sich befindet. Zuvor hatte ich auch andere, uralte Codes gefunden, wo es nur mit der manuellen Entfernung des Sonderzeichens das Auslesen erst möglich war. - Da das Auslesen an sich scheinbar schon klappt, sollte das Schreiben auch noch klappen, was aber erst später getestet wird - Es mag stimmen dass INI-Dateien allgemein veraltet sind, aber es gibt immer noch Anwendungen, die dieses Format noch verwendet und es ist meiner Meinung nach, total OK, dass es da ist. - Für die eigene Anwendung kann man das interne Speicherformat im XML-Format nehmen, das bringt Visual Studio mit sich, aber ich wüsste jetzt auch nicht, warum INI-Dateien besondere Nachteile hätte...