INI-Dateien oder Registry oder persönliche Dateien?

19

Ich möchte die Konfiguration meines Projekts speichern, einschließlich

  1. Bildschirmgröße
  2. Bildschirmposition
  3. Ordnerpfade
  4. Benutzereinstellungen und so weiter.

Die Standardspeicherorte für diese Konfigurationswerte sind:

  1. Registrierung
  2. INI-Dateien
  3. Persönliche Dateien (wie * .cfg)

Wie wählen Sie zwischen diesen Orten? Gibt es auch Vor- und Nachteile , wenn Sie eines davon verwenden?

Shirish11
quelle
2
Welche Tools verwenden Sie? Einige Technologien sind mit hübschen Konfigurationsmanagement-Tools ausgestattet.
@ Pierre303 verwendet derzeit VS 2008 für VC ++
Shirish11
Müssen Benutzer Änderungen vornehmen?
JeffO
1
Haben Sie YAML betrachtet, erhalten Sie das Beste aus beiden, ini und xml en.wikipedia.org/wiki/YAML
JF Dion

Antworten:

20

Gibt es auch Vor- und Nachteile, wenn Sie eines davon verwenden?

Registrierung:

  • + Relativ Standard in der Windows-Umgebung.
  • + Generell gute Unterstützung durch Installateure etc.
  • - Plattformspezifische API, falls Sie jemals Ihre Anwendung portieren möchten.
  • - Nicht besonders lesbar für Menschen.

INI-Dateien:

  • + Einfaches Format.
  • + Tragbar.
  • + Für Menschen lesbar.
  • - Es kann schwierig sein, komplexere Informationen zu speichern (z. B. alles, was mehr als zwei Ebenen tief verschachtelt ist).
  • ?Möglicherweise müssen Sie Ihren eigenen Parser schreiben (obwohl nicht schwierig) oder eine externe Bibliothek wie SimpleIni verwenden (danke an Jonathan Merlet für den Kommentar).

XML-Dateien (ich vermute, dies ist die .cfg-Option):

  • + Ein Standardformat.
  • + Tragbar.
  • + Unterstützt tief verschachtelte Strukturen.
  • - Nicht besonders lesbar für Menschen.

Persönlich verwende ich für Windows-Anwendungen in der Regel C # und gehe zu einer persönlichen Datei für den Benutzer, die als XML gespeichert ist. Ich mache dies normalerweise, weil die menschliche Lesbarkeit bei den von mir geschriebenen Anwendungstypen normalerweise keine Priorität hat (und die Anwendung sollte auf jeden Fall einen Konfigurationseditor haben), und in der .NET- Umgebung ist es sehr einfach, mit XML zu arbeiten. Ich habe sehr oft ein UserConfiguration-Objekt, das einfach in und aus einer Konfigurationsdatei serialisiert wird - fast ohne Entwicklungsaufwand (Parsen, Stöbern), und Sie haben Ihre Konfiguration bereit, um sie in einer stark typisierten Umgebung zu verwenden.

Daniel B
quelle
Ich habe SimpleIni vor einiger Zeit zum Parsen von INI-Dateien verwendet und es hat gut funktioniert.
Jonathan Merlet
@ JonathanMerlet danke, ich habe SimpleIni zu dem Beitrag hinzugefügt.
Daniel B
15

Ich würde mit INI-Dateien gehen, sie sind die menschlichere Option:

[window]
width       = 600
height      = 350
position.x  = 400
position.y  = 200

[paths]
path1       = "/some/random/path/"
path2       = "/some/other/random/path/"

[user]
name        = "Yannis"
preference  = "INI"

XML mag eine gute Option sein, kann aber die Einfachheit und Eleganz von INIs nicht übertreffen:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <window>
        <width>600</width>
        <height>350</height>
        <position>
            <x>400</x>
            <y>200</y>
        </position>
    </window>
    <paths>
        <path1>/some/random/path/</path1>
        <path2>/some/other/random/path/</path1>
    </paths>
    <user>
        <name>Robert</name>
        <preference>XML</preference>
    </user>
</configuration>

INIs sind auch sehr gut verstanden und plattformunabhängig. Es gibt wahrscheinlich nicht so viele Tools für sie wie für XML-Dateien, denn wer braucht ein spezielles Tool, um eine INI-Datei zu lesen und zu bearbeiten?

yannis
quelle
2
Witzig, aber ich finde das XML schöner und leichter zu lesen. Für diejenigen, die die Ausführlichkeit nicht mögen, ist JSON eine geeignete Alternative.
Robert Harvey
3
@RobertHarvey JSON Ich mag (und würde verwenden, wenn ich tieferes Schachteln brauchte), aber XML ist wirklich nicht meine Tasse Tee ...
Yannis
2
XML kann verbessert werden, indem Werte in Attribute gerollt werden. Zum Beispiel<window width="600" height="350" />
Robert Harvey
Ich bin tatsächlich überrascht, dass noch niemand YAML erwähnt hat. Ich denke, es ist menschlicher als JSON, aber in Fähigkeit und Syntax ziemlich ähnlich. Die Website yaml.org verschreckt wahrscheinlich jeden, der damit noch nicht vertraut ist.
Daniel B
@ DanielB Jemand hat YAML erwähnt ;)
Yannis
6

Ich bevorzuge XML-Dateien. Sie sind hierarchisch, Sie können sie auf fast jede erdenkliche Weise nach Ihrem Willen biegen, sie sind gut verstanden, plattformunabhängig und es gibt eine breite Palette von Software zum Lesen und Schreiben.

Robert Harvey
quelle
6
Aber schrecklich wortreich und in der Regel nicht für Menschen lesbar (denken Sie, nicht mit Namespace-Deklarationen und anderen bs bis zum Maximum eingerückt oder aufgebläht).
Manjabes
1
@Manjabes: Merkmale, deren Bedeutung für Konfigurationsdateien unwahrscheinlich ist.
Robert Harvey
@ Robert Harvey: Sehr wichtig, wo ich wohne. Für die grundlegenden Einstellungen verwenden Sie die GUI, für die erweiterten Einstellungen bearbeiten Sie die INI.
Pieter B
6

Um Jeff Ds Vorschlag von YAML zu erweitern , folgt eine kurze Einführung.

YAML ähnelt JSON (JSON ist eine Teilmenge von YAML seit Version 1.2 des YAML-Standards, und daher kann gültiges JSON von YAML-Parsern analysiert werden). Auf den ersten Blick besteht der Hauptunterschied darin, dass YAML (standardmäßig) Einrückungen anstelle von Klammern verwendet, um die Hierarchie anzuzeigen. Es gibt auch einen merklichen Mangel an Anführungszeichen für Zeichenfolgen. Ein kurzes Beispiel von oben:

configuration:
  window: 
    width:       600
    height:      350
    position:
      x:         400
      y:         200
  paths:
    path1:       some/random/path
    path2:       some/other/random/path
  user:
    name:        Joe Soap
    preference:  YAML

Weitere Beispiele finden Sie auf der YAML-Seite von Wikipedia . Unterstützung für YAML gibt es für die meisten Hauptsprachen ( Details finden Sie unter yaml.org ).

Daniel B
quelle
3

Sie haben eine Option vergessen: die Datenbank. Dies wird hauptsächlich in Szenarien verwendet, in denen sich Benutzer bei Ihrer Anwendung anmelden, wenn sich Ihre Anwendung nicht auf den angemeldeten Windows-Benutzer verlassen kann. Dies ist beispielsweise der Fall, wenn Ihre App in einem Kioskmodusfenster ausgeführt wird.

Pieter B
quelle
Möglicherweise benötigen Sie eine INI-Datei oder einen Registrierungsschlüssel, um die Verbindungsdetails / Zeichenfolge zur Datenbank zu speichern
Class Skeleton
@CamelCase Inifile oder Registrierungsschlüssel wurde bereits in der Frage erwähnt, jedoch nicht in der Datenbank. Ich wollte nicht sagen, dass Sie nicht mehrere Methoden gleichzeitig anwenden können.
Pieter B
1

Meine persönlichen Vorlieben sind XML-Dateien:

In den meisten Fällen erwarte ich nicht, dass der Benutzer seine Konfigurationseinstellungen bearbeiten muss, sodass das Problem der Lesbarkeit in diesem Fall kein Argument ist.

Wenn sie bearbeitet werden müssen, können Sie ein Bearbeitungswerkzeug bereitstellen - dies verhindert, dass der Benutzer etwas Dummes mit den Daten macht. Wenn sie die Standardeinstellungen wiederherstellen möchten, können Sie ihnen einfach sagen, dass sie die Datei x löschen sollen, was die meisten Benutzer gerne tun.

Beachten Sie, dass Sie weiterhin darauf achten müssen, dass Sie zum Speichern Ihrer Datei berechtigt sind, da einige Speicherorte in Windows 7 usw. standardmäßig keinen Schreibzugriff haben.


INI-Dateien sind eine gute Standardmethode zum Speichern von Konfigurationen und haben sich bewährt, aber sie fühlen sich für mich ein bisschen wie Windows 3.1 an!

Wahrscheinlich die beste Option, wenn Sie möchten, dass der Benutzer an seinen Daten basteln kann


Ich würde mich persönlich von der Registry fernhalten. Zum einen können Sie nicht garantieren, dass der Benutzer über die erforderlichen Lese- / Schreibrechte verfügt, wo immer Sie Ihre Daten speichern möchten.

In neueren Betriebssystemen, in denen die Registrierungsvirtualisierung zum Einsatz kommt, kann dies große Verwirrung stiften, da Sie die virtualisierten Einstellungen nicht "sehen" können. Dies hat uns mehr als einmal gestört, da wir stundenlang versucht haben, herauszufinden, warum etwas nicht funktioniert hat.

Matt Wilko
quelle
3
Wenn Sie sich Sorgen über Berechtigungen für Registrierungsspeicherorte machen, versuchen Sie wahrscheinlich, diese am falschen Ort zu speichern. Der Benutzer sollte über Berechtigungen für die Struktur HKey_Current_User verfügen, und dort sollten sich die Benutzereinstellungen befinden!
Neil White
@NeilWhite - Einverstanden, dass sie Berechtigungen haben sollten , aber ein überaus eifriger IT-Administrator kann dies ändern (oder Lese- / Schreibrechte erteilen, aber keine Berechtigungen erstellen). Auch das OP erwähnte nicht, dass diese Einstellungen notwendigerweise pro Benutzer waren , sie können pro Maschine sein.
Matt Wilko
Die Größe der Registrierung kann ebenfalls begrenzt sein. Dateien nicht.
16.04.13