Frage

Ich bin ein neuer Windows-Programmierer und bin mir nicht sicher, wo ich vom Benutzer konfigurierbare Anwendungseinstellungen speichern soll.Ich verstehe die Notwendigkeit, dem Benutzer ein benutzerfreundliches Mittel bereitzustellen, um die Anwendungseinstellungen zu ändern, z. B. eine Bearbeitung | Einstellungsformular oder ähnliches.Aber wo soll ich die Werte speichern, nachdem der Benutzer in diesem Formular auf die Schaltfläche „Übernehmen“ geklickt hat?

Welche Vor- und Nachteile hat das Speichern von Einstellungen in der Windows-Registrierung vs.Speichern Sie sie in einer lokalen INI-Datei oder Konfigurationsdatei oder ähnlichem?

War es hilfreich?

Lösung

Vorteile der Konfigurationsdatei:

  1. Einfach zu erledigen.Sie müssen keine Windows-API-Aufrufe kennen.Sie müssen lediglich die Datei-I/O-Schnittstelle Ihrer Programmiersprache kennen.
  2. Tragbar.Wenn Sie Ihre Anwendung auf ein anderes Betriebssystem portieren, müssen Sie Ihr Einstellungsformat nicht ändern.
  3. Vom Benutzer editierbar.Der Benutzer kann die Konfigurationsdatei außerhalb des ausgeführten Programms bearbeiten.

Vorteile der Registrierung:

  1. Sicher.Der Benutzer kann die Konfigurationsdatei nicht versehentlich löschen oder die Daten beschädigen, es sei denn, er kennt sich mit regedit aus.Und dann bittet der Benutzer nur um Ärger.
  2. Ich bin kein erfahrener Windows-Programmierer, aber ich bin mir sicher, dass die Verwendung der Registrierung es einfacher macht, andere Windows-spezifische Dinge zu erledigen (benutzerspezifische Einstellungen, Netzwerkverwaltungsaufgaben wie Gruppenrichtlinien oder was auch immer).

Wenn Sie nur eine einfache Möglichkeit zum Speichern von Konfigurationsinformationen benötigen, würde ich eine Konfigurationsdatei empfehlen, die INI oder XML als Format verwendet.Ich empfehle, die Registrierung nur dann zu verwenden, wenn Sie durch die Verwendung der Registrierung etwas Bestimmtes erreichen möchten.

Andere Tipps

Jeff Atwood hat ein tolles Artikel über die Windows-Registrierung und warum es besser ist, stattdessen .INI-Dateien zu verwenden.

Mein Leben wäre um einiges einfacher, wenn die Einstellungen pro Anwendung an einem Ort gespeichert würden, an dem ich sie leicht sehen, bearbeiten und sichern könnte.Sagen wir mal...in INI-Dateien.

  • Die Registrierung ist ein der Punkt des Versagens.Aus diesem Grund beginnt jeder einzelne Tipp zur Registrierungsbearbeitung, den Sie jemals finden werden, mit einem fetten, schreienden Haftungsausschluss darüber, wie Sie Ihren Computer mit regedit beschädigen können.
  • Die Registrierung ist undurchsichtig und binär.So sehr ich die spitze Klammersteuer auch nicht mag, zumindest sind XML-Konfigurationsdateien einigermaßen für Menschen lesbar und erlauben so viele Kommentare, wie Sie für richtig halten.
  • Die Registrierung muss sein synchron mit dem Dateisystem.Wenn Sie eine Anwendung löschen, ohne sie zu „deinstallieren“, bleibt ein veralteter Registry-Cruft zurück.Oder wenn eine App über ein schlecht geschriebenes Deinstallationsprogramm verfügt.Das Dateisystem ist nicht länger die Protokollangabe – es muss irgendwie mit der Registrierung synchron gehalten werden.Es ist ein völliger Verstoß gegen das DRY-Prinzip.
  • Die Registrierung ist monolithisch.Nehmen wir an, Sie möchten eine Anwendung in einen anderen Pfad auf Ihrem Computer oder sogar auf einen ganz anderen Computer verschieben.Viel Glück beim Extrahieren der relevanten Einstellungen für diese eine bestimmte Anwendung aus dem riesigen Registrierungs-Tarball.Eine bestimmte Anwendung verfügt normalerweise über Dutzende Einstellungen, die über die gesamte Registrierung verstreut sind.

Laut der Dokumentation für GetPrivateProfileString, sollten Sie die Registry zum Speichern von Initialisierungsinformationen verwenden.

Wenn Sie jedoch weiterhin .ini-Dateien verwenden und die Standardprofil-APIs verwenden möchten (GetPrivateProfileString, WritePrivateProfileString, und dergleichen) für den Zugriff darauf bieten sie integrierte Möglichkeiten, um automatisch „virtuelle .ini-Dateien“ bereitzustellen, die von der Registrierung unterstützt werden.Win-Win!

Es gibt eine ähnliche Frage Hier Das deckt einige der Vor- und Nachteile ab.

Ich würde vorschlagen, die Registrierung nicht zu verwenden, es sei denn, Ihre Anwendung benötigt sie unbedingt.Soweit ich weiß, versucht Microsoft, aufgrund der Flexibilität der Einstellungsdateien von der Verwendung der Registrierung abzuraten.Außerdem würde ich nicht empfehlen, .ini-Dateien zu verwenden, sondern stattdessen einige davon integrierte Funktionalität zu .Net zum Speichern von Benutzer-/App-Einstellungen.

Die Verwendung einer INI-Datei im selben Verzeichnis wie die Anwendung ermöglicht die Sicherung mit der Anwendung.Nachdem Sie Ihr Betriebssystem neu geladen haben, stellen Sie einfach das Anwendungsverzeichnis wieder her und schon haben Sie die Konfiguration, die Ihren Wünschen entspricht.

Es gibt noch einen weiteren Vorteil der Verwendung einer INI-Datei gegenüber der Registrierung, den ich nicht erwähnt habe:Wenn der Benutzer eine Art volume-/dateibasierte Verschlüsselung verwendet, kann er die INI-Datei ganz einfach verschlüsseln.Bei der Registry wird es wohl problematischer.

Wie Daniel angedeutet hat, bietet Ihnen das Speichern von Konfigurationsdaten in der Registrierung die Möglichkeit, Admin-Vorlagen zu verwenden.Das heißt, Sie können eine Admin-Vorlage definieren, diese in einer Gruppenrichtlinie verwenden und die Konfiguration Ihrer Anwendung netzwerkweit verwalten.Abhängig von der Art der Anwendung kann dies ein großer Segen sein.

Ich stimme Daniel zu.Wenn es sich um eine große Anwendung handelt, würde ich wahrscheinlich Dinge in der Registrierung tun.Wenn es sich um eine kleine Anwendung handelt und Sie möchten, dass Teile davon vom Benutzer konfigurierbar sind, ohne ein Konfigurationsformular zu erstellen, greifen Sie zu einer schnellen INI-Datei.

Normalerweise mache ich das Parsen so (wenn das Format in der .ini-Datei Option = Wert, 1 pro Zeile, Kommentare beginnend mit # ist):

static void Parse()
{
    StreamReader tr = new StreamReader("config.ini");
    string line;
    Dictionary<string, string> config = new Dictionary<string, string>();

    while ((line = tr.ReadLine()) != null)
    {
        // Allow for comments and empty lines.
        if (line == "" || line.StartsWith("#"))
            continue;

        string[] kvPair = line.Split('=');

        // Format must be option = value.
        if (kvPair.Length != 2)
            continue;

        // If the option already exists, it's overwritten.
        config[kvPair[0].Trim()] = kvPair[1].Trim();
    }
}

Bearbeiten:Entschuldigung, ich dachte, Sie hätten die Sprache angegeben.Die obige Implementierung erfolgt in C#.

Die Registrierung ist für schnellen Zugriff und einfache Aktualisierung optimiert und stellt die einzige Möglichkeit dar, bestimmte Windows-spezifische Dinge wie die Verknüpfung mit einer Erweiterung durchzuführen.Und Sie können das Argument ignorieren, ein einzelnes Verzeichnis zu löschen, um Ihr Programm zu deinstallieren – Windows Vista lässt Sie keine Dateien im Verzeichnis „Programme“ ändern, sodass Ihre Konfiguration ohnehin in einem anderen Ordner abgelegt werden muss.

Es gibt eine allgemeine Richtlinie für die Windows-Programmierung: Machen Sie die Dinge so, wie Microsoft es von Ihnen erwartet, und Ihr Leben wird viel einfacher.

Dennoch sehe ich den Reiz der INI-Akte ein und würde es niemandem verübeln, dass er darüber nachdenkt.

Die vorhandenen Antworten decken viele Bereiche ab, aber ich dachte, ich würde noch einen weiteren Punkt erwähnen.

Ich verwende die Registrierung, um systemweite Einstellungen zu speichern.Das heißt, wenn zwei oder mehr Programme genau die gleiche Einstellung benötigen.Mit anderen Worten, eine Einstellung, die von mehreren Programmen gemeinsam genutzt wird.

In allen anderen Fällen verwende ich eine lokale Konfigurationsdatei, die sich entweder im selben Pfad wie die ausführbare Datei oder eine Ebene tiefer (in einem Konfigurationsverzeichnis) befindet.Die Gründe werden bereits in anderen Antworten behandelt (portabel, kann mit einem Texteditor bearbeitet werden usw.).

Warum systemweite Einstellungen in die Registrierung einfügen?Nun, ich habe festgestellt, dass es am Ende zu Duplikaten von Einstellungen kommt, wenn eine Einstellung geteilt wird, Sie aber lokale Konfigurationsdateien verwenden.Dies kann dazu führen, dass Sie eine Einstellung an mehreren Stellen ändern müssen.

Angenommen, Programm A und Programm B verweisen beide auf dieselbe Datenbank.Sie können eine „systemweite“ Registrierungseinstellung für die Verbindungszeichenfolge festlegen.Wenn Sie auf eine andere Datenbank verweisen möchten, können Sie die Verbindungszeichenfolge an einer Stelle ändern und beide Programme werden nun für die andere Datenbank ausgeführt.

Hinweis: Es macht keinen Sinn, die Registrierung auf diese Weise zu verwenden, wenn nicht zwei oder mehr Programme dieselben Werte verwenden müssen.Beispielsweise benötigen Programm A und Programm B beide eine Datenbankverbindungszeichenfolge Mai gleich sein, aber nicht immer.Ich möchte beispielsweise, dass Programm B jetzt eine Testdatenbank verwendet, Programm A jedoch weiterhin eine Produktionsdatenbank verwenden soll.

Mit dem obigen Beispiel könnten Sie einige lokale Konfigurationen systemweite Einstellungen überschreiben lassen, aber für einfache Aufgaben könnte es zu kompliziert werden.

Ini- oder Konfigurationsdateien haben einen Nachteil: Sie können sie nur finden, wenn der Benutzer auswählen kann, wo das Programm installiert werden soll.

Handelt es sich bei Ihrer Anwendung um eine Anwendung, die mit einem Setup-Programm installiert wird, oder handelt es sich lediglich um eine „Extrahieren und Ausführen“-Anwendung?Schauen Sie sich im ersten Fall die hier aufgeführten Vor- und Nachteile an.Aber für Extrahieren und Ausführen ist die Registrierung meiner Meinung nach ein „No-Go“, da die Leute erwarten, dass sie einfach den Anwendungsordner löschen können, um Ihr Programm loszuwerden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top