Mit diesem Snippet kann man ganz einfach eine
INI-Datei auslesen. Die INI-Datei wird in einem Dictionary gespeichert.
// NAMESPACE(S):
using System.Collections;
using System.IO;
// ZUGRIFF (Beispiel):
Hashtable meineINI = holeIniDateiAlsHashtable(@"C:\Users\Falcone\Desktop\konfiguration.ini", 2, '=', '#');
Um den Wert eines Schlüssels in einer Hashtable herausfinden zu können...http://dotnet-snippets.de/dns/wert-aus-einer-hashtable-ueber-schluessel-herausfinden-SID1663.aspxACHTUNG:Sollten Werte in der INI-Datei Base64 verschlüsselt abgespeichert werden,
sollte vorher das Paddingzeichen (meistens '=') durch ein anderes Zeichen (z. B. '+')
ersetzt werden, da der Standard-Seperator einer INI-Datei meistens auch '=' ist.
Meine config.ini:config.ini
**********
# Infos ueber den Benutzer
# ************************
vorname=max
nachname=mustermann
geburtsdatum=01.01.1990
geburtsort=muenchen
# Anmelde-Variablen (verschluesselt:)
# ***********************************
username=4fFs2gRy
password=zjH05GhE
# Soll das Passwort gespeichert werden (0 = nein / 1 = ja)
savePassword=1
# Der Pfad zum hintergrundbild der Windows Forms Anwendung
bgpath=C:\Users\Falcone\Desktop\meinBild.jpg
# Allgemeine Regel fuer INIs
key=value
/// <summary>
/// Gibt den Inhalt einer INI-Datei als Dictionary zurueck
/// ******************************************************
/// </summary>
/// <param name="pfad">Der Pfad zur INI-Datei</param>
/// <param name="anzahlKopfzeilen">Gegebenenfalls Kopfzeilen ueberlesen</param>
/// <param name="trennzeichen">
/// Das Trennzeichen in der INI-Datei (meistens das Gleichzeichen)
/// ACHTUNG! Darf weder im Schluessel noch im Wert vorkommen!!!
/// </param>
/// <param name="kommentarzeichen">
/// Wenn das Zeichen am Anfang einer Zeile steht wird diese auskommentiert
/// </param>
/// <returns></returns>
public List<Dictionary<string,string>> holeIniDateiAlsDictionaryList(string pfad = "", ushort anzahlKopfzeilen = 0, char trennzeichen = '=', char kommentarzeichen = '#')
{
// Variablen um INI-Datei auszulesen
string aktuelleZeile = ""; // Die Zeile die gerade aus der Datei gelesen wird
string schluessel = ""; // linke Seite vom Seperator (Schluessel)
string wert = ""; // rechte Seite vom Seperator (Wert)
string[] daten = new string[2]; // [0] = Schluessel / [1] = Wert
Dictionary<string,string> sektionen = new Dictionary<string,string>(); // Erstelle eine Tabelle (Schluessel:Wert)
List < Dictionary<string, string>> inidatei = new List<Dictionary<string,string>>(); // Erstelle eine Liste mit Tabellen / Sektionen
// Testen ob pfad existiert
if (File.Exists(pfad))
{
try
{
// oeffne Datei ueber pfad (lesender Zugriff)
using (StreamReader sr = new StreamReader(pfad)) // StreamReader im using oeffnen da IDisposable (damit nach einem Programmabsturz noch auf die Datei zugreifen kann)
{
// ueberlese Kopfzeilen
for (int i = 0; i < anzahlKopfzeilen; i++) // lese solange bis die gewollte anzahl der Kopfzeilen ueberlesen wurde
{
sr.ReadLine(); // lese Zeile... (ohne abzuspeichern!)
}
// lese restliche Datei als ini (da Kopfzeilen gerade ueberlesen wurden)
while (!sr.EndOfStream) // solange wie das Ende der Datei nicht erreicht ist...
{
// Zeile lesen
aktuelleZeile = sr.ReadLine().TrimStart(" ".ToCharArray()); // speichere aktuelle Zeile ohne Anfangs-Leerzeichen in Variable
// wenn Zeile nicht leer, keine Kommentarzeile & keine Sektion ist
if (!string.IsNullOrEmpty(aktuelleZeile) && Convert.ToChar(aktuelleZeile.Substring(0, 1)) != kommentarzeichen && (aktuelleZeile.Substring(0, 1) != "[" && aktuelleZeile.Substring(aktuelleZeile.Length - 1, 1) != "]"))
{
// Zeile korrekt verarbeiten
daten = aktuelleZeile.Split(trennzeichen); // trenne Schluessel und Wert per Trennzeichen und speichere die beiden getrennt ab
schluessel = daten[0]; // Schluessel in Variable abspeichern
wert = daten[1]; // Wert in Variable abspeichern
// in Tabelle einpflegen
sektionen.Add(schluessel, wert);
}
else if (aktuelleZeile.Substring(0, 1) == "[" && aktuelleZeile.Substring(aktuelleZeile.Length -1,1) == "]") // Sektion!
{
// War dictionary gefuellt? Wenn ja:
if (sektionen.Count > 0)
{
// Neue Sektion hinzufuegen:
inidatei.Add(sektionen); // in Liste einfuegen
sektionen.Clear(); // neues Dictionary beginnen (altes dictionary leeren)
// Sektionsschluessel hinzufuegen
sektionen.Add("[SECTION]", aktuelleZeile);
}
}
}
// Stream schliessen
sr.Close();
}
}
catch (IndexOutOfRangeException) // Falls zuviele werte im datenarray gespeichert werden sollten
{
MessageBox.Show("Bitte ueberpruefen Sie ob die Ini-Datei wohlgeformt ist.", "Fehler bei der Datenverarbeitung");
}
catch (Exception exc) // Falls ein unbekannter Fehler auftreten sollte
{
MessageBox.Show("Nachricht:\n\n" + exc.Message + "\n\n\n" + "Stackverfolgung:\n\n" + exc.StackTrace, "Ein unerwateter Fehler ist aufgetreten");
}
}
else
{
// Falls der pfad nicht existiert
MessageBox.Show("Die Datei wurde nicht gefunden, bitte ueberpruefen Sie den Dateipfad nochmal.", "Fehler bei dem einlesen der Datei");
}
// Tabelle zurueckgeben um spaeter damit weiter arbeiten zu koennen
return inidatei;
}