Pfad für My.Settings beeinflussen (Roaming)

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Pfad für My.Settings beeinflussen (Roaming)

    Hallo Leute,
    ich stehe mal wieder vor einem Problem und ich denke das hier auch nur eine kleinigkeit ist (sehe den Wald vor lauter Bäumen nicht). Zumindest hoffe ich das.

    Ich speichere bei meiner Anwendung dieverse Programmeinstellungen in verschiedene My.Setting variablen. Diese werden Benutzerspezifisch in %AppData% abgelegt. Das funktioniert auch alles und ist gut, jedoch gefällt mit der Pfad nicht.

    Der Pflad sieht wie folgt aus:

    %appdata%\[FIRMA]\[Anwendungsname][color=#FF0000].exe_Url_0v1m2rzu14jrlbn2ncjyu1stfbtc51sf[/color]\[Version]\user.config

    Mich stört die URL an dem Anwendungsnamen. Weis jemand wie ich das hinbekommen, dass die URL nicht mit genommen wird, als das Verzeichniss nur nach Anwendungsname benannt wird???

    Danke und Grüße
    Wenn ich deinen Titel so lese, dann suchst du evtl noch etwas anderes, als du gefragt hast.

    Du kannst den Pfad der Settings insofern beeinflussen, als das du die Einstellungen nicht lokal, sondern im Roaming Profil speicherst. In einer Domäne werden die Settings somit im Serverprofil gespeichert und sind somit unabhängig vom PC verfügbar. Einfach ans Domänen-Benutzerprofil gekoppelt.


    Einfach jede Setting einzeln auswählen und unter dem Eigenschaftenpanel Roaming = True auswählen!

    Die URL im Pfad kriegst du nur weg, wenn Du einen Starken Namen verwendest. (stackoverflow.com/a/20273550)

    Veronesi
    Der Prvider läuft auch mit FW 3.5 problemlos...
    Am besten, du erstellst dir mit VS2008 eine neu Klassenbilbliothek mit den Namen UserSettingsProvider.dll und kopierst dir den Code UserSettingsProvider.vb.

    UserSettingsProvider.vb

    VB.NET-Quellcode

    1. Imports System.Configuration
    2. Imports System.ComponentModel
    3. Imports System.Reflection
    4. Imports System.IO
    5. Imports System.Collections.Specialized
    6. Imports System.Runtime.Serialization.Formatters.Binary
    7. Namespace MyProvider
    8. ''' <summary>
    9. ''' Dieser Provider speichert die betroffenen Settings-Einstellungen in eine eigene .exe.config.xml-Datei.
    10. ''' Diese Datei liegt im Arbeitsverzeichnis der Anwendung.
    11. ''' HINWEISE:
    12. ''' Die ApplicationName-Property erstellt die ProduktName-Eigenschaft von der My.Application.Info.ProduktName
    13. ''' Hier sollte in den Projekteigenschaften/Anwendung/Assemblyinformationen die Eigenschaft ProduktName = AssemblyName gestellt sein!
    14. ''' </summary>
    15. ''' <remarks></remarks>
    16. Public Class UserSettingsProvider
    17. Inherits SettingsProvider
    18. Implements IApplicationSettingsProvider
    19. Private Datas As Dictionary(Of String, Object)
    20. Private Property DataFile As FileInfo
    21. Private Property AppPath As String
    22. Sub New()
    23. Dim fi = New FileInfo(Assembly.GetExecutingAssembly.Location)
    24. ApplicationName = fi.Name.Replace(fi.Extension, String.Empty)
    25. AppPath = fi.FullName.Replace(fi.Name, String.Empty)
    26. DataFile = New FileInfo(Path.Combine(AppPath, String.Concat(ApplicationName, ".exe.config.dat")))
    27. Datas = New Dictionary(Of String, Object)()
    28. End Sub
    29. Public Overrides Sub Initialize(ByVal name As String, ByVal config As NameValueCollection)
    30. MyBase.Initialize(ApplicationName, config)
    31. End Sub
    32. Public Overrides Property ApplicationName() As String ' hier wird der Produktname von der Assembly angegeben
    33. Public Overrides ReadOnly Property Name As String
    34. Get
    35. Return "UserSettingsProvider"
    36. End Get
    37. End Property
    38. ''' <summary>
    39. ''' SetPropertyValues wird erst abgearbeitet, wenn ApplicationSettingsBase.Save durchgeführt wird.
    40. ''' ApplicationSettingsBase stellt sicher, dass für jeden einzelnen Provider nur seine markierten Werte herangenommen werden.
    41. ''' Egal, ob der Provider auf einer Einzel-Einstellung angesetzt ist oder ob klassenweit die Einstellung angegeben wurde.
    42. ''' Wenn Einstellungen nicht verändert wurden, müssen sie nicht gespeichert werden!
    43. ''' Anwendungsspezifische Einstellungen können nicht geändert werden und werden daher auch nicht gespeichert!
    44. ''' </summary>
    45. ''' <param name="context"></param>
    46. ''' <param name="collection"></param>
    47. Public Overrides Sub SetPropertyValues(ByVal context As SettingsContext, ByVal collection As SettingsPropertyValueCollection)
    48. For Each prpValue As SettingsPropertyValue In collection
    49. If Not prpValue.IsDirty OrElse (prpValue.SerializedValue Is Nothing) Then Continue For
    50. If IsApplicationScoped(prpValue.Property) Then Continue For
    51. Datas(prpValue.Name) = prpValue.SerializedValue
    52. Next
    53. SaveBinary(DataFile, Datas)
    54. End Sub
    55. Public Overrides Function GetPropertyValues(ByVal context As SettingsContext, ByVal collection As SettingsPropertyCollection) As SettingsPropertyValueCollection
    56. If DataFile.Exists Then Datas = LoadBinary(DataFile)
    57. Dim col As New SettingsPropertyValueCollection()
    58. For Each prp As SettingsProperty In collection
    59. Dim Value As New SettingsPropertyValue(prp)
    60. If Datas.ContainsKey(prp.Name) Then Value = GetPropertyValue(prp) ' Wert von Datas einlesen
    61. col.Add(Value)
    62. Next
    63. Return col
    64. End Function
    65. ''' <summary>
    66. ''' Nur benutzerspezifische Eigenschaften sind zulässig.
    67. ''' Wenn eine Eigenschaft keinen Wert hat, wird der Defaultwert geladen.
    68. ''' </summary>
    69. ''' <param name="prp"></param>
    70. Private Function GetPropertyValue(ByVal prp As SettingsProperty) As SettingsPropertyValue
    71. Dim value As New SettingsPropertyValue(prp)
    72. If IsUserScoped(prp) Then value.SerializedValue = Datas(prp.Name)
    73. value.IsDirty = False
    74. Return value
    75. End Function
    76. ''' <summary>
    77. ''' Test auf anwendungsspezifische Eigenschaft
    78. ''' </summary>
    79. ''' <param name="prop"></param>
    80. Private Function IsApplicationScoped(ByVal prop As SettingsProperty) As Boolean
    81. Return HasSettingScope(prop, GetType(ApplicationScopedSettingAttribute))
    82. End Function
    83. ''' <summary>
    84. ''' Test auf benutzerdefinierte Eigenschaft
    85. ''' </summary>
    86. ''' <param name="prop"></param>
    87. Private Function IsUserScoped(prop As SettingsProperty) As Boolean
    88. Return HasSettingScope(prop, GetType(UserScopedSettingAttribute))
    89. End Function
    90. ''' <summary>
    91. ''' prüft auf erlaubte Einstellung, so wie es der LocalFileSettingsProvider auch macht ...
    92. ''' </summary>
    93. ''' <param name="prop"></param>
    94. ''' <param name="attributeType"></param>
    95. Private Function HasSettingScope(ByVal prop As SettingsProperty, ByVal attributeType As Type) As Boolean
    96. Dim isAppScoped As Boolean = prop.Attributes(GetType(ApplicationScopedSettingAttribute)) IsNot Nothing
    97. Dim isUserScoped As Boolean = prop.Attributes(GetType(UserScopedSettingAttribute)) IsNot Nothing
    98. If isUserScoped AndAlso isAppScoped Then Throw New ConfigurationErrorsException("BothScopeAttributes: " & prop.Name)
    99. If Not isUserScoped AndAlso Not isAppScoped Then Throw New ConfigurationErrorsException("NoScopeAttributes: " & prop.Name)
    100. Select Case True
    101. Case attributeType Is GetType(ApplicationScopedSettingAttribute) : Return isAppScoped
    102. Case attributeType Is GetType(UserScopedSettingAttribute) : Return isUserScoped
    103. Case Else : Return False
    104. End Select
    105. End Function
    106. ''' <summary>
    107. ''' Daten binär speichern
    108. ''' </summary>
    109. ''' <param name="DataFile"></param>
    110. ''' <param name="Datas"></param>
    111. Private Sub SaveBinary(DataFile As FileInfo, Datas As Dictionary(Of String, Object))
    112. deleteLocalPathUserSettings()
    113. Using fs As Stream = File.Create(DataFile.FullName)
    114. Dim binfmt As New BinaryFormatter()
    115. binfmt.Serialize(fs, Datas)
    116. End Using
    117. End Sub
    118. ''' <summary>
    119. ''' falls der LocalUserAppDataPath vorhanden ist,
    120. ''' wird der Ordner mit allen untergeordneten Verzeichnissen gelöscht
    121. ''' </summary>
    122. ''' <remarks></remarks>
    123. Private Sub deleteLocalPathUserSettings()
    124. Dim di As New DirectoryInfo(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath)
    125. di = di.Parent.Parent.Parent
    126. If di.Exists Then di.Delete(True)
    127. End Sub
    128. ''' <summary>
    129. ''' binäre Daten laden
    130. ''' </summary>
    131. ''' <param name="DataFile"></param>
    132. Private Function LoadBinary(DataFile As FileInfo) As Dictionary(Of String, Object)
    133. Using fs As Stream = File.Open(DataFile.FullName, FileMode.Open)
    134. Dim binfmt As New BinaryFormatter()
    135. Return CType(binfmt.Deserialize(fs), Dictionary(Of String, Object))
    136. End Using
    137. End Function
    138. #Region "IApplicationSettingsProvider Members"
    139. ''' <summary>
    140. ''' Abrufen der letzten Version der Settingseigenschaft
    141. ''' </summary>
    142. ''' <param name="context"></param>
    143. ''' <param name="property"></param>
    144. Public Function GetPreviousVersion(ByVal context As SettingsContext, ByVal [property] As SettingsProperty) As SettingsPropertyValue Implements IApplicationSettingsProvider.GetPreviousVersion
    145. Dim prpValue As New SettingsPropertyValue([property])
    146. If Datas.ContainsKey([property].Name) Then prpValue.PropertyValue = Datas([property].Name)
    147. Return prpValue
    148. End Function
    149. ''' <summary>
    150. ''' wieder auf die Defaultwerte der Settings zurücksetzen!
    151. ''' </summary>
    152. ''' <param name="context"></param>
    153. Public Sub Reset(ByVal context As SettingsContext) Implements IApplicationSettingsProvider.Reset
    154. If DataFile.Exists Then Datas.Clear() : SaveBinary(DataFile, Datas)
    155. End Sub
    156. ''' <summary>
    157. ''' ErfinderDesRades
    158. ''' fehlende Settings werden sofort der Sammlung entfernt
    159. ''' neue hinzugekommene Settings werden beim nächsten Speichervorgang gesichert
    160. ''' </summary>
    161. ''' <param name="context"></param>
    162. ''' <param name="properties"></param>
    163. Public Sub Upgrade(ByVal context As SettingsContext, ByVal properties As SettingsPropertyCollection) Implements IApplicationSettingsProvider.Upgrade
    164. If Datas.Count = 0 AndAlso DataFile.Exists Then Datas = LoadBinary(DataFile)
    165. Dim toDelete = Datas.Keys.Except(properties.Cast(Of SettingsProperty).Select(Function(p) p.Name)).ToList
    166. toDelete.ForEach(AddressOf Datas.Remove)
    167. End Sub
    168. #End Region
    169. End Class
    170. End Namespace


    In Zeile #29 wird der Pfad, wohin persistiert werden soll, in der Variable DataFile festgelegt...
    Die Methoden LoadBinary und SaveBinary kann man auf seine Bedürfnisse ändern...
    Auf obige Bibliothek machst du dir dann in deinem Projekt einen Verweis und und gibst in Settings.vb den Provider bekannt.

    Settings.vb

    VB.NET-Quellcode

    1. Namespace My
    2. <Global.System.Configuration.SettingsProvider(GetType(UserSettingsProvider.MyProvider.UserSettingsProvider))> _
    3. Partial Friend NotInheritable Class MySettings
    4. End Class
    5. End Namespace

    In Projekt/Einstellungen kannst du dann deine Settings mit dem Provider persistieren...