WPF / C#:我应该在哪里保存用户首选项文件?

时间:2008-12-28 14:51:37

标签: c# wpf file

保存用户首选项文件的推荐位置是什么?是否有推荐的方法来处理用户偏好?

目前,我使用从typeof(MyLibrary).Assembly.Location返回的路径作为默认位置来存储应用程序生成或要求的文件。

编辑: 我发现了两个相关/有趣的问题:

编辑#2:编辑#2: 对于像我这样以前从未使用过设置的人来说,这只是一个注释。 设置非常有用,但我不得不做一大堆挖掘来弄清楚发生了什么(来自Python世界,而不是我使用的东西)。事情变得复杂,因为我想保存字典,显然它们不能被序列化。设置似乎也存储在3个不同的文件中,具体取决于您的操作。有一个app.configuser.config和一个settings.setting文件。所以这里有两个我觉得有用的链接:

4 个答案:

答案 0 :(得分:69)

您可以轻松使用“应用程序设置”。

如果您尚未执行此操作,只需右键单击该项目并选择“属性”。选择“设置”选项卡。确保为示波器选择“用户”(否则设置为只读)。

访问它的代码很简单:

forms.Width = Application1.Properties.Settings.Default.Width;

如果您需要保存它:

Application1.Properties.Settings.Default.Width = forms.Width;
Application1.Properties.Settings.Default.Save();

在上面的示例中,Width是您在Settings选项卡中定义的自定义设置名称,Application1是您应用程序的Namespace。

编辑:回答更多问题

您提到要在“设置”中存储“词典”对象。正如您所发现的那样,您无法直接执行此操作,因为Dictionary对象不可序列化。但是,您可以非常轻松地创建自己的可序列化字典。保罗·韦尔泽有一个很好的例子on his blog

你有几个链接,这种情况有点混乱。您的原始问题是保存“用户首选项文件”的位置。我非常肯定微软打算使用设置功能就是......存储用户皮肤偏好,布局选择等等。它不是一个应用程序数据的通用存储库,尽管它很容易被滥用。

数据存储在不同的地方是有充分理由的。某些设置是应用程序设置,并且是只读的。这些是应用程序需要运行但不是特定于用户的设置(例如,应用程序资源的URI或税率)。这些存储在app.config中。

用户设置存储在User Document / Settings文件夹深处的模糊目录中。默认值存储在app.config中(我想,不能回想起我的头脑中的某些内容)但是任何用户更改都存储在他们的个人文件夹中。这适用于从用户更改为用户的数据。 (“用户”是指Windows用户,而不是您应用的用户。)

希望这对你有所澄清。该系统实际上非常简单。起初看起来有点像外国人,但经过几天的使用之后,你再也不会想到它......它只是有效。

答案 1 :(得分:27)

以非管理员身份或在Vista上运行时,您无法写入“程序文件”文件夹(或其任何子文件夹)。

存储用户首选项的正确位置是(显然用正确的名称替换MyCompanyName和MyApplicationName)

在磁盘上:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\MyCompanyName\\MyApplicationName"

或者在密钥下的注册表中:

 HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName

这些位置是针对每个用户的,他们与非管理员用户,使用同一台计算机的多个用户,快速用户切换,终端服务以及人们可以与您的软件进行交互的所有其他方式一起工作。

如果您需要所有用户的公共位置,那么:

  1. 仅当用户以管理员身份运行时才会起作用
  2. 它无法在Vista上可靠地运行
  3. 您必须自己处理所有事情(例如,通过快速用户切换,同时在同一台计算机上运行应用程序的两个用户)。
  4. 并且位置是:

    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationCommonData) + "\\MyCompanyName\\MyApplicationName"
    

    或者在密钥下的注册表中:

     HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName
    

答案 2 :(得分:3)

您可以使用隔离存储。您可以按用户,程序集和/或域进行隔离。

隔离存储介绍
http://msdn.microsoft.com/en-us/library/3ak841sy(VS.80).aspx

隔离类型
http://msdn.microsoft.com/en-us/library/eh5d60e1(VS.80).aspx

答案 3 :(得分:1)

以下似乎是最佳选择:

Application.UserAppDataPath