Registry vs. INI-Datei vs. Datenbank (Programmparameter speichern)

  • VB.NET

Es gibt 22 Antworten in diesem Thema. Der letzte Beitrag () ist von dive26.

    Registry vs. INI-Datei vs. Datenbank (Programmparameter speichern)

    Hallo Leute!

    In meiner "alten" Software (unter VB6) habe ich lokale Einstellungen wie z.B. Datenpfad, Verhalten der Software, Fensterpositionen- und Auflösungen etc. in der Benutzer-Registry gespeichert. Daten die von mehreren Clients benötigt wurden, wurden in Datenbanken gespeichert.

    Für mich stellt sich nun die Frage, was zeitgemäß und die sauberste Lösung ist um Programmparameter so zu speichern, damit diese beim nächsten Start auf dem selben Rechner wieder zur Verfügung stehen.

    Folgende Möglichkeiten habe ich in Betracht bezogen:

    1) Registry-Einträge
    2) INI-Dateien (txt oder xml Dateien im Programmverzeichnis)
    3) Datenbank im Programmverzeichnis

    Damit die Software weis, wo es die Informationen herbekommt müsste ich bei Variante 2 und 3 trotzdem zumindest den Datenpfad in die Registry speichern.

    Was würdet Ihr verwenden bzw. gibt es eine Methode die ich hier nicht aufgelistet habe und in VB2012 bereits vorhanden ist und das Speichern von Einstellungen ungemein erleichtert?

    Es ist auch zu bedenken, dass die Software eine Datensicherungsfunktion hat, wo diese Einstellungen auch mitgesichert werden sollen.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    In vb.net gibt es da die "Settings" welche du mit My.Settings aufrufen kannst.

    Im Forum & im Web wirst du schnell fündig wenn du danach suchst ;)

    EDIT: MSDN - My.Setting

    Du findest diese unter den "Projekteinstellungen" --> "Settings"
    Dort können StringCollections , Strings , Integer usw. angelegt werden.

    Diese werden dann unter C:\Users\MaxMustermann\AppData gespeichert.
    Ich bin ein Freund von .ini-Dateien wenn es um lokale Sachen geht, welche nur für diesen einen PC gelten.
    Bei Einstellungen welche mehrere Rechner im Netzwerk benötigen verwende ich Datenbanken. (Der Connection-String zur DB steht zB wieder in der .ini.)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    dive26 schrieb:

    2) INI-Dateien (txt oder xml Dateien im Programmverzeichnis)
    3) Datenbank im Programmverzeichnis
    Das mit dem "im Programmverzeichnis" führt sehr oft zu ungewollten Verhalten:
    Wenn Software installiert wird, landet diese im Programm-Verzeichnis (z. B. C:\Program Files). Dort haben nur Administratoren Schreibrechte. Das bedeutet, dass die Einstellungen nur gespeichert werden können, wenn das Programm mit einem Adminsitratorbenutzer gestartet wurde (oder es wurden manuell entsprechende Rechte auf den ordner gesetzt).
    Falls dieses Verhalten nicht explizit erwünscht ist (bei deinem Zweck "Datensicherung" würde ich aber sogar fast schon davon ausgehen), rate ich stark davon ab.

    Sind die Einstellungen Per-Machine oder Per-User? Bei letzterem bieten sich die Anwendungsdaten (%appdata%/%localappdata%) an.
    My.Settings verwendet eben diese Verzeichnisse. Man kann auch davon ausgehen, dass das (in den meisten Fällen) angebracht ist, denn sonst hätte MS sich nicht dazu entschieden, es so zu machen.

    INI-Dateien wird heutzutage nur noch selten verwendet. Meistens verwendet man heute eine einfache Serialisierung von Klassen nach XML, JSON oder ein anderes Format (My.Settings verwendet XML). Wenn INI, dann würde ich sogar soweit gehen, einen eigenen Sserializer zu verwenden, statt die WinAPI-Funktionen.

    Ob die Registry heute noch oft verwendet wird, kann man (IMO) nicht sagen. Windows selbst macht es, .NET-Programme allerdings nicht häufig, da es einfachere Alternativen (My.Settings) gibt, die auch von Haus aus schon eine gute Abstraktion bieten.
    Von meinem iPhone gesendet
    Danke für die Info.

    Könnte man die Daten, die man mit My.Settings gespeichert hat auch (im Notfall) irgendwo im Klartext wieder auslesen?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Kein Problem. Eine Standard-XML-Datei, nur der Pfad dieser Datei ist kryptisch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst diese inerhalb deines Projektes aufrufen wann immer du willst.

    Wenn du eine STringCollection anlegst würde das wiefolgt gehen:

    VB.NET-Quellcode

    1. For Each Item in My.Settings.deinDefinierterName
    2. MessageBox.Show(Item)
    3. 'oder
    4. TextBox1.Text = Item
    5. Next
    Ok, dann werde ich My.Settings verwenden und einfach beim Verlassen der Software alle Settings in eine Backup-Ini-Datei schreiben.

    Danke für Eure Infos. Habt mir damit wieder sehr geholfen.
    Top Forum, Top Leute hier!

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    So unterschiedlich sind die Ansichten. Ich vermeide seit einiger Zeit die Verwendung von INI-Dateien wo es mir möglich ist und verwende zum Speichern von Einstellungen grundsätzlich die Registry.

    Wenn es sich um eine Anwendung handelt, die mit mehreren Clients in einem Netzwerk die Konfiguration teilt, handelt es sich in den meisten Fällen eh um einen Anwendungsfall, bei dem auch eine Datenbank zum Einsatz kommt, so dass diese gemeinsamen Daten eben genau hier abgelegt werden.

    Geht es darum, zusätzlich benutzer- oder rechnerspezifische Dateien abzulegen, kann hier auch eine ggf. vorliegende Datenbank herhalten oder im gebräuchlichsten Fall werden dazu dann die übers Framework auslesbaren Anwendungsverzeichnisse für den aktuellen Benutzer und für alle Benutzer verwendet. Je nach Art der Dateien und Typ der Anwendung kann man die Wahl des Speicherorts aber natürlich auch dem Benutzer freistellen. Die Wahl wird dann wiederum in der Registry bzw. Datenbank vermerkt.

    My.Settings ist IIRC nur in VB.NET verfügbar, und da ich auch viel in C# mache könnte ich damit nicht viel anfangen, weshalb ich das eigentlich nie nutze.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    dive26 schrieb:

    Ok, dann werde ich My.Settings verwenden
    Das geht wesentlich einfacher.
    Du kannst beim Anlegen der Settings jedem einen Initialwert geben.
    Beim Start werden die Initialwerte geladen und mit denen aus dem gespeicherten File überschrieben.
    Kommen also neue Settings hinzu, erhalten diese den Initialwert, alle anderen werden ausgelesen.
    Wenn die Projekteinstellung stimmt, werden diese automatisch beim Beenden des Programms gespeichert, es besteht also kein weiterer Handlungsbedarf.
    Wenn Du allerdings Dein Programm von einem anderen Pfad aus startestr (Debug, Release, der installierte Pfad), wird initial je eine neue Settingsdatei angelegt, d.h., Du hast ggf. bei Debug und Release verschiedene Settings.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Die XML-Datei zu finden ist möglich, nicht sonderlich einfach. Die Dateiendung ist nicht .xml, sondern .config.
    Für die Benutzerkonfiguration heißt sie user.config und liegt irgendwo in %appdata% oder %localappdata%.

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <configuration>
    3. <userSettings>
    4. <Anwendungsname.My.MySettings>
    5. <setting name="Firstkey" serializeAs="String">
    6. <value>0</value>
    7. </setting>
    8. <setting name="Secondkey" serializeAs="String">
    9. <value>F8</value>
    10. </setting>
    11. <setting name="MarkerWidth" serializeAs="String">
    12. <value>15</value>
    13. </setting>
    14. <setting name="EnableDb" serializeAs="String">
    15. <value>True</value>
    16. </setting>
    17. </Anwendungsname.My.MySettings>
    18. </userSettings>
    19. </configuration>


    Diese lag hier:
    %localappdata%\Publishername\DasProgramm.exe_Url_gurehx4emcggt2swyqdngylyzn2wj01o\0.9.6.150


    Ich glaube für Computerspezifische Einstellungen heißt sie machine.config. Da bin ich mir aber nicht ganz sicher.

    Welche Einstellung von welchem Typ sein soll kann man einstellen.

    Arby schrieb:

    My.Settings ist IIRC nur in VB.NET verfügbar, und da ich auch viel in C# mache könnte ich damit nicht viel anfangen
    My.Settings gibt es in C# auch und heißt dort einfach nur anders, nämlich Properties.Settings.Default.
    Von meinem iPhone gesendet

    nikeee13 schrieb:

    My.Settings gibt es in C# auch und heißt dort einfach nur anders, nämlich Properties.Settings.Default.
    Okay, gut zu wissen, aber ich werde dennoch weiterhin die Variante mit der Registry bevorzugen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Auch wenn ich die Settings von "Benutzer" auf "Anwendung" stelle, werden die Daten hier abgelegt:

    C:\Users\Roland\AppData\Local\bonit.at_Software

    Kann ich die My.Settings nicht so speichern, dass diese von JEDEM angemeldeten Benutzer verwendet werden können, egal ob normaler User oder Admin ?

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Hallo Nikee!

    Ich bin die Links mal überflogen, aber das hört sich schon sehr umständlich und aufwändig an. :wacko:

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    @dive26:: Soll jeder (separat eingeloggte) User seine eigenen Settings haben
    oder
    sollen immer alle User dieselben Settings haben?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Alle User die selben Settings.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at
    Dann solltest Du auch nur genau eine Konfigurationsdatei verwenden, da musst Du den Inhalt aber selbst verwalten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Übersicht: Strategien zum persistieren von Einstellungen
    Ini-Dateien schneiden da am schlechtesten ab, denn bereits der Xml-Standard ist wesentlich mächtiger (ganz zu schweigen vom typDataset).
    Und hier habichmal ein ganz eigenes Format vorgestellt: kompakt, typisiert und kann sowohl Einzelwerte als auch Tabellen: flexible Settings
    Danke ErfinderDesRades!

    Das es sehr viele Möglichkeiten gibt, muss ich die für mich am idealsten finden.

    Es werden keine komplexen Datenstrukturen abgelegt, sondern "primitive" Informationen.
    Daher werde ich die My.Settings verwenden und zusätzlich die selben Daten auch in einer ini-Datei als Backup im Datenpfad ablegen (kleine Routine beim Beenden der Software).
    Wechselt dann einmal jemand von einem Windows-Benutzer zum anderen und wurde dort noch keine Grundkonfiguration der Software vorgenommen, dann wird einfach die INI-Datei aus dem Datenpfad ausgelesen und in die My.Settings übertragen.

    Diese Vorgangsweise ist auch für Datensicherungen (und dann eventuelle Rücksicherungen nach Betriebssystem-Neuinstallation) ideal.

    LG Roland
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at