Kategorien
Tutorials

Visual C#: Arbeiten mit INI-Dateien

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.

Dieser Artikel basiert auf Version 1.0.3 vom 23.08.2017 der Klasse 'INIFile'.

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.

visual-c-sharp-arbeiten-mit-ini-dateien-01

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

visual-c-sharp-arbeiten-mit-ini-dateien-02

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.

Seit mehreren Jahren begeistere ich mich privat und beruflich für die IT. Das habe ich dann auch zum Anlass genommen, diesen Blog ins Leben zu rufen, um dort praxisnahe Tutorials über verschiedene IT-Themen zu schreiben und meine selbst geschriebene Software zu veröffentlichen.

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.

///
/// 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

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

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...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert