Feedback

C# - Read simple INI-File

Veröffentlicht von am 30.10.2016
(0 Bewertungen)
Diese Klasse/Funktion kann eine einfach INI-Datei auslesen.
Damit ist es möglich, ganze Konfigurationen an die Nutzer zu verteilen.

PS: Ich nutze das Dateiformat für Update-Definitionen.
Bei mir heißen die Werte dann:
Build=(int) - Der Build des Updates
DownloadSource=http://.../update_package.dat
Signature=....
Hash=...


internal static class INIReader
    {
        /*
         * File-Format:
         * _______________________
         * 
         * #Comment
         * [Section]
         * Value1=My Content
         * Author=Thomas Roskop, 2016
         *
         */

        const string LINE_SEPARATOR = "\r\n";
        const string KEY_VALUE_SEPARATOR = "=";

        public static Dictionary<string, string> _Read(string config)
        {
            Dictionary<string, string> _s = new Dictionary<string, string>();
            string[] lines = config.Split(new string[] { LINE_SEPARATOR }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var l in lines)
            {
                string t = l.Trim();
                if (t[0] == '#')
                {
                    // Es wurde ein Kommentar gefunden ('#' als erstes Zeichen der Zeile).
                    // Dieser wird beim lesen ignoriert.
                }
                else
                {
                    string[] kv = t.Split(new string[] { KEY_VALUE_SEPARATOR }, StringSplitOptions.None);
                    // Wenn es mehr oder weniger als 2 Einträge in dieser Zeile sind, dann ist der Eintrag ungültig formatiert worden 
                    // order es handelt sich um eine Sektion, e.g. "[Section-Name]"
                    if (kv.Length == 2)
                    {
                        _s.Add(kv[0].Trim(), kv[1].Trim());
                    }
                }
            }

            return _s;
        }
    }
Abgelegt unter c#, INI, System, Read, Config.

3 Kommentare zum Snippet

danieljena schrieb am 30.10.2016:
Wo greifst du die Section ab?
Was ist nämlich mit so einem Fall, wo man in verschiedenen Sectionen die gleichen Schlüssel hat?
Thomas Roskop schrieb am 30.10.2016:
@danieljena: Uups... Auf die Sektionen muss man einzeln zugreifen können?
Bislang ging ich immer davon aus, dass diese Sektionen eher dem Leser zur Übersicht dienen. Hatte bislang noch keine .ini gesehen, wo der selbe Schlüssel mehrfach vorkam...

Kleiner Workaround (wenn jemand unbedingt den selben Schlüsselnamen mehrfach haben will):

[sectionA]
sectionA.myKey = 1

[sectionB]
sectionB.myKey = 1


und dann den Zugriff per:

var filecontent = ... Read File Content. Mit FileIO.ReadAllText() zum Beispiel...
var res = INIReader._Read(...);
string f = section + "." + keyMame;
string value = res[f];
Koopakiller schrieb am 30.10.2016:
@Thomas Ja, das geht. Das habe ich auch schon ein paar mal in INI Dateien gesehen.

Als etwas schwierig sehe ich an, dass der Zeilenumbruch auf einen bestimmten Wert festgelegt wird. Man muss die Datei nur mal mit einem falsch eingestellten Editor öffnen und wieder speichern und shcon sind da andere Zeilenumbrüche drin. Daher würde ich auf alle \r\n Kombinationen achten. Eventuell wäre das direkte Einlesen via File.ReadLines o.ä. hier auch praktischer. Bei sehr großen wäre es zumindest performanter.

Je nach Spezifikation gibt es übrigens auch noch Kommentare in dieser Dateiform.

Für eigene Settings würde ich sowieso XML o.ä. bevorzugen, von daher wäre die Klasse vielleicht etwas für ein Bestandsprojekt, aber da fehlt eben noch ein bisschen was.
 

Logge dich ein, um hier zu kommentieren!