【问题标题】:store setting in relative path to executable aplication将设置存储在可执行应用程序的相对路径中
【发布时间】:2020-03-23 04:52:41
【问题描述】:

我正在开发一个从 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 中的完整项目即将推出!!!

【问题讨论】:

  • AFAIK 您无法更改从My.Settings 生成的文件的路径,但您可以创建自己的类来存储设置,然后使用 XML 序列化将其写入文件。跨度>
  • @VisualVincent 有什么例子,你的代码???
  • 不幸的是,我们没有在 Stack Overflow 上做 examples。而是查找主题,那里有很多好文章。我个人最喜欢的是这个:Serialization 101 - Part III: XML Serialization
  • @VisualVincent 不是 vb.net
  • 如果您指的是这篇文章,它实际上也是针对 VB.NET 的。如果您仔细查看每个 C# 示例,您会发现还有一个 VB.NET 版本。但是,如果您仍然对这篇文章不满意,那么正如我之前提到的,还有更多内容。您可以找到更适合您的。

标签: vb.net visual-studio settings


【解决方案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

【讨论】:

  • 当然对你有用,但我建议实际序列化而不是简单地自己编写/读取 XML。通过使用序列化,为您完成了大量的错误检查和结构验证,从而提高了代码的可靠性。不过,很高兴您设法找到了解决方案!
  • @VisualVincent 好吧,由于时间的原因,我无法解决序列化问题......我对此并不陌生,与我找到的其他解决方案相比,我只需要花费更长的时间适应......因为没有人回答我的问题只有周围的cmets和意见......
  • 只是为了记录,我自己没有写答案的原因是因为不知道你的数据结构,写一个将不适合 Stack Overflow,因为它不是一个 精确 回答你的问题。这也是我们不举例子的原因:如果你不确定它是否能回答这个问题,那么它就不能被认为是一个答案。例如,您不知道您将要给出的示例是否是 OP 实际寻找的。​​span>
  • 但是如果您仍然感兴趣并且想告诉我您需要保存哪些数据以及您希望/需要如何检索它,我可以写一个答案你使用 XML 序列化。
  • 我将使用我想要获得的最终 XML 更新问题...我还将提出与同一 xml 相关的另一个问题...您将看到一个用于保存以编程方式进行按钮配置...如果 XML 不存在,我必须创建一个初始的...实际上当程序第一次打开时...我还将发布项目 github ...如果您有兴趣参与。
【解决方案2】:

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

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

  • XmlElement - 通常是最常见的一种。指定属性将被序列化为它自己的元素。可以通过在构造函数中设置ElementName 参数来自定义生成的名称。

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

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

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

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

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)

【讨论】:

    猜你喜欢
    • 2014-04-04
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 2016-08-30
    相关资源
    最近更新 更多