C# 如何更改.NET应用程序的预定义userconfig目录?

C# 如何更改.NET应用程序的预定义userconfig目录?,c#,.net,vb.net,user-config,settingsprovider,C#,.net,Vb.net,User Config,Settingsprovider,当前,我的应用程序的用户设置存储在此默认目录中: C:\Users\{User Name}\AppData\Roaming\{Company Name}\{Assembly Name}.vshos_Url_{Hash}\{Assembly Version} C:\Users\{User Name}\AppData\Roaming\{Assembly Name} 我知道默认Microsoft命名规则的含义,我的问题是:如何在执行时或通过修改appconfig文件来更改defaut文件夹 我的目

当前,我的应用程序的用户设置存储在此默认目录中:

C:\Users\{User Name}\AppData\Roaming\{Company Name}\{Assembly Name}.vshos_Url_{Hash}\{Assembly Version}
C:\Users\{User Name}\AppData\Roaming\{Assembly Name}
我知道默认Microsoft命名规则的含义,我的问题是:如何在执行时或通过修改appconfig文件来更改defaut文件夹

我的目的是只能处理将保存应用程序的用户设置的目录,例如,我希望将用户设置文件保存在此目录中:

C:\Users\{User Name}\AppData\Roaming\{Company Name}\{Assembly Name}.vshos_Url_{Hash}\{Assembly Version}
C:\Users\{User Name}\AppData\Roaming\{Assembly Name}

我知道这是可以实现的,因为我见过许多.NET应用程序可以将其userconfig文件存储在自定义漫游文件夹中,而该文件夹不遵循Microsoft默认规则以及未处理的哈希和其他注释命名规则。

我看到了许多与此相关的问题,例如:

要做任何特殊的事情,将XDoc或LinqXML与您自己的配置文件一起使用要容易得多


这样,您可以随时将它们保存在您喜欢的位置,并且不会遇到其他问题,例如:

我已经看到了许多与此相关的问题,例如:

要做任何特殊的事情,将XDoc或LinqXML与您自己的配置文件一起使用要容易得多


通过这种方式,您可以随时将它们保存在您喜欢的位置,并且不会遇到其他问题,例如:

存在命名约定,这样NET就可以确保加载了正确的设置。由于您已经将管理设置的控制权让给了NET Framework/VB应用程序框架,因此它还负责确保应用程序加载正确的设置集。在这种情况下,证据散列用于唯一地将一个
WindowsApplication1
与另一个区分开来(除其他外)

我知道这是可以实现的,因为我见过很多.NET应用程序可以将其userconfig文件存储在自定义漫游文件夹中

这是可能的,但我不确定一切都是你得出的结论。我非常严重地怀疑,当许多应用程序可以更容易地使用自定义设置类将XML文件保存到该位置时,它们会遇到麻烦来实现自定义提供程序

简单的解决方案 编写自己的用户选项类,并自己序列化。例如,可以使用一个共享/静态方法在很少的代码中对类进行反序列化(这恰好使用JSON):

Friend共享函数Load()作为用户选项
'在新安装时为默认值创建实例
将u设置为新用户选项
如果File.Exists(filePath)存在,则
'文件路径可以位于您可以访问的任何位置!
Dim jstr=File.ReadAllText(文件路径)
如果String.IsNullOrEmpty(jstr)=False,则
u=JsonConvert.DeserializeObject(用户选项的集合)(jstr)
如果结束
如果结束
返回u
端函数
实现它的应用程序:

UOpt=UserOptions.Load()
在众多优点中,您可以完全控制文件的保存位置,并且可以使用任何您喜欢的序列化程序。最重要的是,它是简单的——比下面介绍的代码少得多

缺点是使用它的代码必须手动加载和保存它们(在应用程序事件中很容易处理),并且没有专门的设计器

漫长而曲折的道路:定制设置提供商 自定义
设置Provider
将允许您更改处理、保存和加载设置的方式,包括更改文件夹位置

这个问题狭隘地集中在更改文件位置上。问题在于,没有一种(干净、简单)的方法让你的应用程序与你的
设置提供者交谈,以指定文件夹。提供者需要能够在内部解决这一问题,当然也要保持一致

大多数人希望做的不仅仅是更改所使用的文件夹名称。例如,在游戏中,我使用了一个SQLite数据库来代替XML,该数据库反映了代码使用的结构。这使得加载本地和正确的漫游值变得非常容易。如果一直采用这种方法,代码可以大大简化,而且很可能整个升级过程都会简化。因此,该提供商考虑了一些更广泛的需求

尽管您只想更改文件名,但仍有两个关键注意事项:

本地与漫游

将提供程序编码为始终存储在
AppData\Roaming
中,但在其中写入不合格的本地设置是不负责任的。为了在文件夹名中省略证据散列,不应牺牲它们之间的区别

注意:每个
设置
都可以设置为
漫游
本地
值:在设置编辑器中选择设置后,打开属性窗格-将
漫游
更改为True

这里的(极)几个问题似乎达成了共识,这些问题涉及自定义
设置Provider
,以将本地和漫游保存到同一个文件中的不同部分。这非常有意义,而且比从2个文件加载更简单,因此使用的XML结构是:


真的
15:32:18
...
98, 480
d62eb904-0bb9-4897-bb86-688d974db4a6
C:\文件夹ABC
187, 360
a1f8d5a5-f7ec-4bf9-b7b8-712e80c69d93
C:\XYZ文件夹
漫游项目存储在以使用它们的MachineName命名的部分中。保留
.My.MySettings
节点可能有一些价值,但我不确定它的用途

我删除了
SerializeAs
元素,因为它没有被使用

版本

如果调用
My.Settings.Upgrade
,则不会发生任何事情。尽管它是一种
设置
方法,但实际上它是
应用程序设置库
中的一种方法,因此您的提供商不参与其中

因此,如果您自动将完整版本字符串用作文件夹的一部分,则会导致问题