Laden...

.conf Dateien auslesen/bearbeiten in C#

Erstellt von Chrisexpress vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.901 Views
Thema geschlossen
C
Chrisexpress Themenstarter:in
12 Beiträge seit 2011
vor 12 Jahren
.conf Dateien auslesen/bearbeiten in C#

Hallo liebe C#-Entwickler Community,

ich bin mal wieder mit einem Anliegen bzw. einer Frage in euren Foren unterwegs:

Diesmal bezieht sich meine Frage auf Konfigurationsdateien mit der Endung (.conf) [Kein XML!!]

Nämlich möchte ich in meinem Programm gern eine solche Datei bzw. dessen Inhalt und Variablen auslesen und ggf. auch bearbeiten.
Meine erste Frage dabei wäre, ob .NET hierfür eine Basisklasse bereitstellt, was ich zunächst nicht vermute, weil es sich bei dem Format ja eher um ein Unix, Linux typisches Format handelt.
Sollte meine erste Frage, also mit "nein" beantwortet werden, so frage ich mich, ob irgendjemand für die Konfigurationsdateien eine entsprechende Klasse geschrieben hat, oder weiß, wo ich eine finden kann.

Für alle, denen dieses Format fremd ist, hier ein Snippet:

[pre]
UseProcessors = 0

#
#    ProcessPriority
#        Description: Process priority setting for Windows based systems.
#        Default:     1 - (High)
#                     0 - (Normal)

ProcessPriority = 1

#
#    Compression
#        Description: Compression level for client update packages
#        Range:       1-9
#        Default:     1   - (Speed)
#                     9   - (Best compression)

Compression = 1
[/pre]

Zeilen, die mit "#" beginnen, sind Kommentare. Alles andere sind Wertezuweisungen von Variablen.

Entsprechend habe ich mich auch ran gemacht und angefangen, eine Methode zur Ermittlung des Wertes einer bestimmten Variable aus dieser Konfig zu schreiben ... Der Ansatz ist allerdings falsch, wie mir scheint, da es zur Endlosschleife kommt:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ArtifeX_Handler
{
    class ConfManager
    {
        private string file;
        private FileStream fs;

        public ConfManager(string f)
        {
            if ((File.Exists(f)) && (f.EndsWith(".conf")))
                this.file = f;
            else
                this.file = "";
        }

        public string getValueByKey(string key)
        {
            if (this.file == "")
            {
                return "";
            }

            StreamReader sr;
            string full = "";
            int pos_key;
            int pos_val;
            string mark = "";
            fs = new FileStream(this.file, FileMode.Open);
            sr = new StreamReader(fs);
            string value_result = "";

            while (sr.Peek() != -1)
            {
                full += sr.ReadLine() + "\n";
            }

            sr.Close();

            pos_key = full.IndexOf(key);
            pos_val = pos_key + key.Length + 3;
            //Aktuelle Position vom Schüsselwort + die Länge des Schlüsselwortes + 3     Zeichen für: <Leerzeichen><Zuweisungsoperator><Leerzeichen>

            while (mark != "\n")
            {
                //solange kein Zeilenumbruch
                mark = (full.ElementAt(pos_val)).ToString();
                value_result += mark;
            }

            return value_result;
        }
    }
}

Also, würde mich freuen, wenn ihr mir Tipps oder Hinweise geben könntet.

Mit freundlichen Grüßen, Chrisexpress

Mit freundlichen Grüßen, Chris

2.079 Beiträge seit 2012
vor 12 Jahren

Morgen

Zu deinen Fragen betreffend der config-Datei kann ich leider keine Antwort geben, aber vielleicht kann ich bei deinem Code helfen:

Wenn ich mir das so durchlese, dann denke ich, hängt der ganze Code an der Schleife, die so lange läuft, wie es kein "\n" gibt.
Ich meine mich zuerinnern, dass ich das auch mal in einem FileStream vergeblich gesucht habe.

Versuch doch mal die Datei nicht komplett zu lesen, sondern zeilenweise und dann als Array verwenden, oder wenn du deinen Code nicht ändern willst, die Zeilen dann einfach wieder aneinander hängen, dann aber mit einem "\n" getrennt.

Ich würde den Code ändern^^

Probier einfach mal aus

Hoffe, ich konnte dir etwas helfen^^

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Chrisexpress,

es ist viel einfacher, solche Dateien komplett einzulesen (File.ReadAllLines) und dann im Speicher zu analysieren, z.B. per Regex. Dafür braucht man nicht mehr als eine handvoll Codezeilen. Das Einlesen und Analysieren von solch einfachen Dateien fällt allerdings unter [Hinweis] Wie poste ich richtig? Punkt 1.1.1, genauso wie die Fehlersuche in solchem Code.

Das Format entspricht dem INI-Format, nur dass es anscheinend keine Sections gibt. Insofern solltest du die Dateien mit jedem beliebigen der zahlreichen INI-Reader (von denen es auch ein paar im Forum gibt), lesen können.

herbivore

Thema geschlossen