Lesen und Schreiben von INI-Dateien in C#

Muhammad Zeeshan 12 Oktober 2023
  1. Was ist die INI-Datei in C#
  2. Verwenden Sie WritePrivateProfileString, um neue und geänderte Einstellungen in einer INI-Datei in C# zu speichern
  3. Verwendung von ReadPrivateProfileString zum Lesen von Daten aus einer INI-Datei in C#
  4. Lesen und Schreiben von INI-Dateien in C#
Lesen und Schreiben von INI-Dateien in C#

Dieses Tutorial lehrt das Lesen und Schreiben von INI-Dateien in C#.

Was ist die INI-Datei in C#

Initialisierungsdateien, oft auch INI-Dateien genannt, sind Textdateien zum Speichern von Programmkonfigurationsinformationen. Das .NET-Framework unterstützt nativ keine INI-Dateien.

Sie können Windows-API-Methoden verwenden, die Plattformaufrufdienste verwenden, um in die Dateien zu schreiben und daraus zu lesen. Dieses Tutorial erstellt eine Klasse, die INI-Dateien darstellt, und manipuliert sie mit Windows-API-Operationen.

Um mit INI-Dateien arbeiten zu können, benötigen wir zwei Windows-API-Funktionen, WritePrivateProfileString und ReadPrivateProfileString.

Verwenden Sie WritePrivateProfileString, um neue und geänderte Einstellungen in einer INI-Datei in C# zu speichern

In einer INI-Datei speichert WritePrivateProfileString neue und geänderte Einstellungen. Die Struktur ist wie folgt.

bool WritePrivateProfileString(string name, string key, string value, string filepath);

Die Funktion gibt ein boolesches Ergebnis wahr zurück, wenn das Schreiben erfolgreich ist, und falsch, wenn das Schreiben fehlschlägt. Das Folgende sind die Parameter.

  1. Der Name des zu schreibenden Abschnitts wird durch name angegeben.
  2. Der Name des zu setzenden Schlüssels wird mit key angegeben.
  3. Der Wert für den Schlüssel wird durch value angegeben.
  4. Der Dateipfad enthält den Speicherort der zu aktualisierenden INI-Datei.

Verwendung von ReadPrivateProfileString zum Lesen von Daten aus einer INI-Datei in C#

ReadPrivateProfileString liest Daten aus einer INI-Datei. Die Funktion liest je nach Anwendung einzelne Werte, alle Schlüsselnamen aus einem Abschnitt oder alle Abschnittsnamen.

int GetPrivateProfileString(string name, string key, string default, StringBuilder ReturnedVal,
                            int maxsize, string filepath);

Die Anzahl der Zeichen im zurückgegebenen Wert wird von der Funktion als Ganzzahl ohne Vorzeichen zurückgegeben. Das Folgende sind die Parameter.

  1. Der Name des auszulesenden Abschnitts wird mit name angegeben. Wenn dies auf null gesetzt ist, werden alle Abschnittsnamen zurückgegeben.
  2. Mit key wird der Name des auszulesenden Schlüssels angegeben. Der zurückgegebene Wert enthält die Namen der Schlüssel im angegebenen Abschnitt, wenn er auf null gesetzt ist, während der name nicht null ist.
  3. Wenn der Schlüssel nicht vorhanden ist, gibt default einen Standardwert an, der zurückgegeben werden soll.
  4. ReturnedVal erhält einen String, der als Puffer dient. Das Ergebnis der Operation wird in den Puffer geschrieben, wodurch der Wert der Zeichenfolge geändert wird.
  5. Die maximale Größe des Strings, der in ReturnedVal zurückgegeben wird, wird durch maxsize angegeben. Diese sollte der Puffergröße entsprechen. Ist der aus der INI-Datei gelesene Wert länger als ReturnedVal, wird er gekürzt.
  6. Mit filepath werden Ort und Name der auszulesenden INI-Datei angegeben. Diese Datei muss vorhanden sein.

Lesen und Schreiben von INI-Dateien in C#

Lassen Sie uns eine Klasse erstellen, die die Strukturen der Windows-API-Funktionen enthält, die wir verwenden werden, nachdem wir ihre Strukturen gesehen haben.

Fügen Sie die folgenden Bibliotheken hinzu.

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

Erstellen Sie eine neue Klasse namens ReadWriteINIfile und verwenden Sie den folgenden Klassencode. Da es für die Klasse selbst keinen Zugriffsmodifikator gibt, hat sie einen internen Geltungsbereich.

Die Klasse IniFile greift auf die API-Funktionen zu, ohne sie der Öffentlichkeit zugänglich zu machen.

public class ReadWriteINIfile {
  [DllImport("kernel32")]
  private static extern long WritePrivateProfileString(string name, string key, string val,
                                                       string filePath);
  [DllImport("kernel32")]
  private static extern int GetPrivateProfileString(string section, string key, string def,
                                                    StringBuilder retVal, int size,
                                                    string filePath);
}

Wir können jetzt die Klasse ReadWriteINIfile konstruieren, die es uns ermöglicht, INI-Dateien zu lesen, ohne die API-Operationen zu kennen.

Fügen Sie der Klasse den folgenden Code hinzu, um den Konstruktor zu erstellen.

public ReadWriteINIfile(string inipath) {
  path = inipath;
}

WritePrivateProfileString wird verwendet, um eine INI-Datei mit Werten zu füllen. Im folgenden Code werden drei Argumente verwendet, um die Abschnitts- und Schlüsselnamen sowie den zu speichernden Wert zu akzeptieren.

Beim Aufruf von WritePrivateProfileString werden diese Werte mit dem an den Konstruktor übergebenen Dateinamen kombiniert.

public void WriteINI(string name, string key, string value) {
  WritePrivateProfileString(name, key, value, this.path);
}

Die Argumente für ReadINI sind der zu lesende name und key. Die erste Zeile des obigen Codes definiert die Zeichenfolge und setzt ihren Wert auf mehrere Leerzeichen, die ihrer maximalen Länge entsprechen.

Die Funktion GetPrivateProfileString erhält diesen String als zu füllenden Puffer. Verwenden Sie den folgenden Code.

public string ReadINI(string name, string key) {
  StringBuilder sb = new StringBuilder(255);
  int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
  return sb.ToString();
}

Vollständiger Quellcode:

using System;
using System.IO;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Text;

namespace Test {
  class Program {
    static void Main(string[] args) {}
  }
  public class ReadWriteINIfile {
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string name, string key, string val,
                                                         string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section, string key, string def,
                                                      StringBuilder retVal, int size,
                                                      string filePath);

    public string path;

    public ReadWriteINIfile(string inipath) {
      path = inipath;
    }
    public void WriteINI(string name, string key, string value) {
      WritePrivateProfileString(name, key, value, this.path);
    }
    public string ReadINI(string name, string key) {
      StringBuilder sb = new StringBuilder(255);
      int ini = GetPrivateProfileString(name, key, "", sb, 255, this.path);
      return sb.ToString();
    }
  }
}
Muhammad Zeeshan avatar Muhammad Zeeshan avatar

I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.

LinkedIn