将设置存储在可执行应用程序的相对路径中

时间:2019-11-27 15:25:41

标签: vb.net visual-studio settings

我正在开发一个可以通过USB运行的应用程序,它像扩展坞/启动器应用程序一样,但是有问题。

我想使用My.Settings类保存我的应用程序设置,但是它将设置文件保存在AppData文件夹中,例如C:\Users\<user_name>\AppData\Local\...\...\user.config

我不要那个。我想保存我定义的路径和名称,例如My.Application.Info.DirectoryPath"\Settings.xml"

我该如何实现?

最终XML的更新示例:

<?xml version="1.0" encoding="utf-8"?>
<conf>
    <pos>1</pos>
    <btn index="1" value="D:\League of Legends\" perm="true">LeagueClient.exe</btn>
    <btn index="2" value="D:\RuneLite\" perm="false">RuneLite.exe</btn>
    <btn index="3" value="" perm="false"></btn>
    <btn index="4" value="" perm="false"></btn>
</conf>

Github中的完整项目即将推出!

2 个答案:

答案 0 :(得分:1)

为我工作的方式:

Imports System.IO
Imports System.Xml

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ValConfFile()
    End Sub
    Public Sub ValConfFile()
        If File.Exists("config.xml") = False Then : CreateConfXML() : End If
    End Sub
    Public Sub CreateConfXML()
        Dim obj As Object
        Dim archivo As Object
        Dim x As Integer = 1
        obj = CreateObject("Scripting.FileSystemObject")
        archivo = obj.CreateTextFile("config.xml", True)
        archivo.WriteLine("<?xml version='1.0' encoding='utf-8'?>")
        archivo.WriteLine("<conf>")
        archivo.WriteLine("<pos>1</pos>")
        For x = 1 To 4
            archivo.WriteLine("<btn index='" & CStr(x) & "' value='' perm='false'></btn>")
        Next
        archivo.WriteLine("</conf>")
        archivo.Close()
    End Sub
End Class

答案 1 :(得分:1)

XML序列化可用于此目的,实际上非常简单。您需要做的就是为您的数据设计一个或多个类,然后应用appropriate attributes(它们的名称以Xml...Attribute的形式)以便按照您想要的方式序列化它们。

在此设置中,我使用了四个不同的属性:

  • XmlElement-通常是最常见的一个。指定将属性序列化为其自身的元素。可以通过在构造函数中设置ElementName参数来自定义结果名称。

    如果用于列表或数组,则适用于集合中的每个项目。

  • XmlRoot-与XmlElement几乎相同,但用于根元素(类本身)。

  • XmlAttribute-指定将属性序列化为应用于父对象的属性(name="value"),而不是作为其内部元素的序列。

  • XmlText-指定将属性的值序列化为父对象(即<object>property value</object>)的标签之间的内容。

Imports System.IO
Imports System.Xml
Imports System.Xml.Serialization

<XmlRoot(ElementName:="conf")>
Public Class Config

    <XmlElement(ElementName:="pos")>
    Public Property Position As Integer

    <XmlElement(ElementName:="btn")>
    Public Property Buttons As New List(Of ConfigButton)

    Public Sub New()
    End Sub

    Public Sub New(ByVal Position As Integer)
        Me.Position = Position
    End Sub

    Public Shared Function Load(ByVal File As String) As Config
        Using FStream As New FileStream(File, FileMode.Open, FileAccess.Read, FileShare.Read)
            Dim Serializer As New XmlSerializer(GetType(Config))
            Return Serializer.Deserialize(FStream)
        End Using
    End Function

    Public Sub Save(ByVal File As String)
        Using FStream As New FileStream(File, FileMode.Create, FileAccess.Write, FileShare.None)
            Dim Serializer As New XmlSerializer(GetType(Config))
            Serializer.Serialize(FStream)
        End Using
    End Sub
End Class
Public Class ConfigButton

    <XmlText()>
    Public Property DisplayName As String

    <XmlAttribute("index")>
    Public Property Index As Integer

    <XmlAttribute("perm")>
    Public Property Perm As Boolean

    <XmlAttribute("value")>
    Public Property Value As String

    Public Sub New()
    End Sub

    Public Sub New(ByVal DisplayName As String, ByVal Value As String, ByVal Index As Integer, ByVal Perm As Boolean)
        Me.DisplayName = DisplayName
        Me.Value = Value
        Me.Index = Index
        Me.Perm = Perm
    End Sub
End Class

用法示例:

Private cfg As Config

'
'Loading the config.
'

Private Sub Form1_Load(sender As Object, e As EventArgs) Handled MyBase.Load
    If File.Exists("config.xml") Then
        cfg = Config.Load("config.xml")
    Else
        cfg = New Config()
    End If
End Sub

'
'Saving the config.
'

Private Sub Form1_FormClosed(sender As Object, e As EventArgs) Handles Me.FormClosed
    cfg.Save("config.xml")
End Sub

添加按钮:

cfg.Buttons.Add(New ConfigButton("RuneLite.exe", "D:\RuneLite\", 2, False))

迭代按钮:

For Each btn As ConfigButton In cfg.Buttons
    MessageBox.Show(btn.DisplayName)
Next

删除特定索引处的按钮:

'Removes the fourth button.
cfg.Buttons.RemoveAt(3)