WPF / C#:我应该在哪里保存用户的喜好文件?

什么是保存用户偏好文件的推荐位置? 有没有推荐的方法来处理用户的喜好?

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

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

  • 保存Windows XP和Vista应用程序用户信息的最佳位置
  • 有什么方法来实现保存/加载function?

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

  • http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ddeaca86-a093-4997-82c9-01bc0c630138
  • http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/efe370dc-f933-4e55-adf7-3cd8063949b0/

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

如果您还没有这样做,只需右键单击该项目,然后select属性。 select设置选项卡。 确保你select了“用户”作为范围(否则设置是只读的)。

访问这个代码很简单:

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

如果你需要保存它:

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

在上面的示例中,Width是您在“设置”选项卡中定义的自定义设置名称,Application1是应用程序的命名空间。

编辑:回应更多的问题

你提到你想要在设置中存储Dictionary对象。 正如你发现的那样,你不能直接这样做,因为Dictionary对象是不可序列化的。 但是,你可以很容易地创build你自己的序列化字典。 保罗·韦尔泽在他的博客上有一个很好的例子。

你有几个链接,有点浑浊的情况。 您的原始问题是保存“用户偏好文件”的位置。 我很肯定微软的设置function的意图正是这样的…存储用户的皮肤偏好,布局select等。它不意味着作为一个应用程序的数据通用的存储库,虽然它可能很容易滥用这种方式。

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

用户设置存储在用户文档/设置文件夹深处的混淆目录中。 默认值存储在app.config(我想,不能回想起我的头顶),但任何用户更改都存储在他们的个人文件夹。 这意味着用户之间的数据会发生变化。 (“用户”我的意思是Windows用户,而不是你的应用程序的用户。)

希望这个为你澄清一点。 这个系统其实很简单。 起初看起来有点儿外国人,但在使用它几天之后,你再也不用考虑它了,它只是起作用。

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

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

在磁盘上:

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

或者在registry下键入:

  HKEY_CURRENT_USER\Software\MyCompanyName\MyApplicationName 

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

如果您需要所有用户的共同位置,则:

  1. 只有当用户以pipe理员身份运行时才能工作
  2. 它不能在Vista上可靠地工作
  3. 你必须自己处理所有的事情(比如两个用户通过快速的用户切换同时在同一台计算机上运行应用程序)。

和地点是:

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

或者在registry下键入:

  HKEY_LOCAL_MACHINE\Software\MyCompanyName\MyApplicationName 

你可以使用独立的存储。 您可以通过用户,程序集和/或域进行隔离。

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

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

以下似乎是最好的select:

 Application.UserAppDataPath