我的应用程序设置为什么没有持久化保存?

22

我有一些用户范围的设置,但由于某些原因,它们未保存到 .exe.config 文件中。我按照以下步骤进行操作:

Properties.Settings.Default.Email = "new@value.com";
Properties.Settings.Default.Save();

然而我查看调试文件夹中的设置文件,发现它仍然是我在Visual Studio中设置的默认值。我做错了吗?

5个回答

26

用户设置是特定于用户的,因此它们不会保存回系统范围内的.exe.config文件。

LocalSettingsProvider的文档中可以看到:

应用程序范围的设置和默认的用户范围的设置存储在一个名为application.exe.config的文件中,该文件创建在可执行文件所在的同一目录中。应用程序配置设置是只读的。特定用户数据存储在一个名为username.config的文件中,存储在用户的主目录下。

因此,对于仅在调试器下从VS运行的UserSettingsTest应用程序(因此包括vshost部分),我最终得到了以下路径:

C:\Users\Jon\AppData\Local\UserSettingsTest
  \UserSettingsTest.vshost.e_Url_pdqoppugkz1vaawbhwkkcu5ibxpi2fgu
  \1.0.0.0\user.config

1
我有WinXP,但是在C:\Documents and Settings\Ryan\Application Data中我没有看到任何这样的文件或文件夹。这是正确的位置吗? - ryeguy
3
XP将会是C:\Documents and Settings\Ryan\Local Settings\Application Data。 (翻译:XP operating system's user data folder path will be C:\Documents and Settings\Ryan\Local Settings\Application Data.) - csjohnst
2
我今天已经阅读了超过两打的答案和文章,而这是唯一一个正确获取文件名称和位置的。当然,这是Jon Skeet。 - RBarryYoung
很棒的答案,节省时间。 - NEBEZ

21

如果您的程序集信息设置为自动生成任何版本号(1.0.*),那么每次调试应用程序时,版本号都会不同,并且每次都会创建一个新文件。

如果是这种情况,您需要升级设置文件:

Properties.Settings.Default.Upgrade()

您还可以默认设置 NeedsUpgradingtrue,并在执行升级后将其设置为 false,这样不会经常改变应用程序版本号的最终用户就不会一直升级。


不知道有一个叫做"upgrade"的方法,真是太棒了。 - dr. evil
1
我在这里使用了这种方法并取得了成功:http://bytes.com/topic/c-sharp/answers/522191-how-maintain-user-config-settings-when-upgrading - Jared Updike
很棒的答案,优雅的NeedsUpgrading提示! - DefenestrationDay

2
所有用户范围的设置都保存在应用程序数据中,位于一个文件夹内,该文件夹指示您的应用程序版本和名称。
您可以通过单击“应用程序设置”对话框中的“同步”来查看这些文件夹。
在Vista中通常为:
  • c:\users[currentuser]\AppData\Local[CompanyName][AppName]\version
  • c:\users[currentuser]\AppData\Roaming[CompanyName][AppName]\version
由于设置与当前用户和UAC相关,因此采用这种方式进行。在Vista中,即使应用程序范围的设置也未存储在配置文件中。
[CompanyName]和[ProductName]来自您的程序集信息设置。

0

我发现在运行调试版本时,它总是重新构建并自动增加版本号。新版本期望用户配置文件位于C:\Users\Adrian\AppData\Local\Company\Project\Version。由于这是一个新版本,该文件不存在,因此我又得到了默认值。您可以通过更改设置、保存,然后手动再次运行exe文件(在bin\debug\...文件夹中)来检查此问题。如果这是您的问题,则它将记住您的更改。

要解决此问题,您可以使用Settings.Default.Upgrade()方法。这样做的潜在问题是,如果每次运行它,它都会用旧的设置替换您最近的设置。

解决方案 使用设置编辑器添加一个新设置:

SettingsHaveBeenUpgraded : bool : User : false

在 Program.cs 的 Main() 方法中添加以下代码:
    if (!Settings.Default.SettingsHaveBeenUpgraded)
    {
        Settings.Default.Upgrade();
        Settings.Default.SettingsHaveBeenUpgraded = true;
    }

这将确保升级仅发生一次。


-1

“用户”定义的设置与“应用程序”定义的设置一起记录在app.config文件中。实际上,“用户”命名的设置是一个误称且相当具有误导性。它们应该被称为“默认用户”设置。

当新用户访问应用程序时,默认情况下将分配“用户”设置。

仅当用户设置与位于app.config文件中的“默认用户”设置不同时,才会将用户设置保存到实际用户的user.config设置文件中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接