Einstellungen einer App speichern - Textdatei, My.Settings, Registry?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Einstellungen einer App speichern - Textdatei, My.Settings, Registry?

    Hallo,

    Frage für einen fortgeschrittenen VB-Einsteiger.

    Ich habe für mein lokales Netzwerk ein kleines chat Programm geschrieben. In den Einstellungen kann man die IP-Adressen der chat Partner eintragen. Die Einstellungen sollen natürlich nach dem Schließen und neu Starten des Programms weiterhin vorhanden sein.

    Zunächst habe ich die Adressen mit My.Settings gespeichert. Leider gibt es Situationen, die dazu führen, dass die IP-Adressen nach dem Neustart nicht mehr vorhanden sind und es werden leere Werte aus My.Settings ermittelt.

    Aus diesem Grund würde ich die Einstellungen lieber in eine Textdatei schreiben. Nun lese ich überall, dass INI Dateien nicht mehr benutzt werden sollen. Statt dessen solle man in die Registry schreiben.

    Was ist denn jetzt der beste Weg, seine Einstellungen zu speichern so dass sie beim nächsten Programmstart abrufbar sind? Die Variante Textdatei gefällt mir im Moment am besten.
    @tunixx Willkommen im Forum. :thumbup:
    Hände weg von der Registry :!:
    Mach Dir eine serialisierbare Datenklasse mit allen Daten, die Du beim nächsten Aufruf wieder brauchst.
    Die Instanz dieser Klasse kannst Du als XML-Datei speichern und wieder einlesen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports System.Text
    3. Imports System.Xml.Serialization
    4. ''' <summary>
    5. ''' Datenklasse
    6. ''' </summary>
    7. ''' <remarks>mit XML-Serialisierung</remarks>
    8. Public Class MyData
    9. ' Pfad zur geladenen Datei
    10. Private MyFile As String
    11. ' alle vorkommenden Daten
    12. Public Property name() As String
    13. Public Property address() As String
    14. Public Property type() As Integer
    15. Public Property timestamp() As DateTime
    16. Public Property flags() As Integer
    17. Public Property user() As String
    18. Public Property SingleValues() As List(Of Integer)
    19. Public Sub New()
    20. ' Hier die Daten mit Defaultwerten befüllen oder nicht
    21. Me.name = "Hase"
    22. Me.SingleValues = New List(Of Integer)
    23. End Sub
    24. ''' <summary>
    25. ''' Daten aus einer Datei lesen
    26. ''' </summary>
    27. ''' <param name="file">Dateiname</param>
    28. ''' <returns>die geladene Instanz</returns>
    29. Public Shared Function LoadData(file As String) As MyData
    30. Dim data As New MyData()
    31. Try
    32. ' Deserialize XML file to a new object.
    33. Using sr As New StreamReader(file, Encoding.Default)
    34. Dim x As New XmlSerializer(data.GetType())
    35. data = DirectCast(x.Deserialize(sr), MyData)
    36. End Using
    37. ' Pfad merken
    38. data.MyFile = file
    39. Return data
    40. Catch
    41. ' nix tun, die Daten-Instanz ist nicht valid,
    42. ' es wird die Instanz übergeben, die bei New() erzeugt wird
    43. End Try
    44. ' Pfad bei nicht vorgandener Instanz merken
    45. data.MyFile = file
    46. Return data
    47. End Function
    48. ''' <summary>
    49. ''' Daten in eine Datei schreiben
    50. ''' </summary>
    51. Public Sub WriteData()
    52. ' Serialize object to a XML file.
    53. Using sw As New StreamWriter(Me.MyFile, False, Encoding.Default)
    54. Dim x As New XmlSerializer(Me.GetType())
    55. x.Serialize(sw, Me)
    56. End Using
    57. End Sub
    58. End Class
    Aufruf:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private XmlFile As String = "d:\temp\data.xml" ' Pfad zum Speichern / Lesen
    3. Private Data As MyData
    4. ''' <summary>
    5. ''' Daten von Festplatte laden
    6. ''' </summary>
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Me.Data = MyData.LoadData(Me.XmlFile)
    9. End Sub
    10. ''' <summary>
    11. ''' Daten auf Festplatte schreiben
    12. ''' </summary>
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    14. Me.Data.WriteData()
    15. End Sub
    16. End Class


    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!
    Jo, da gibts zig Möglichkeiten - Registry oder .ini wirklich am wenigsten empfehlenswert.

    Bei Rods Ansatz (und allen anderen selbstgebastelten Files) muss darauf geachtet werden, dass in %AppData% geschrieben wird.
    Ansonsten, wenn das Prog verteilt wird, will es womöglich iwo hinspeichern, wo keine Schreibrechte bestehen.
    Hier hat My.Settings das erfreuliche AlleinstellungsMerkmal, dass man sich nicht drum kümmern muss.

    Ich hab vor langem mal eine Aufstellung der Möglichkeiten gemacht: Wie am besten die Einstellungen speichern?

    Die aufstellung ist unvollständig.
    ZB gibt es auch die Möglichkeit, sich seine Settings selbst zu basteln - gibts ein Tut zu im Tut-Bereich.



    Grundsätzlich täte ich denken, dass für eine popelige Liste von IpAddressen MySettings ausreichen sollten.
    Nu sagst du, das failt manchmal, da täte ich eher erforschen, warum das failt.

    ErfinderDesRades schrieb:

    %AppData%
    Ansonsten schreibst Du sie neben die Exe, da hast Du immer Zugriff.
    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!
    Kommt drauf an, wo die EXE ist. Wenn sie in irgendeinem von Windows mitverwalteten Ordner ist (da als Systemordner angesehen), wird's schwierig. Aber in einem 0815-Verzeichnis eigentlich kein Problem.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ja, im Pfad Program Files hat das Programm nur mit Admin-Rechten Schreibrechte, hab ich eben ausprobiert.
    %AppData% funktioniert immer.
    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!