2013-03-23 79 views
6

我有一个程序,我将使用VS中部署的包进行部署。让用户在部署后编辑配置文件

现在我有,我希望用户能够修改(即使运行该程序后)的app.config文件,但我不知道究竟在何处安装程序转储文件,我不期待用户可以绕过他们的文件系统。我想要的是 - 我要求用户指定一些目录(无论如何要发生它自一个游戏) - 我检查那里的配置文件,如果它不存在,我复制它从根目录程序可以看到的目录 - 然后读取'save'文件夹中的目录。

这就是说,它的听起来像一个非常丑陋和hacky的解决方案 - 有更好的?

回答

8

我不会鼓励用户修改app.config。 app.config被复制到与您的应用程序exe相同的目录中,并且通常包含您的应用程序依赖其运行的设置,例如,数据库连接字符串,系统默认值等。通过让用户直接更改其中的设置,可以演奏危险的游戏。

一种更安全的方法是将另一个XML文件导出到用户文档文件夹中,以便它们可以覆盖应用程序设置。首先将app加载到app.config中,然后使用用户自己的配置文件中的任何设置覆盖这些值。

我也建议为此实现某种用户界面,即使它非常基本。您的普通用户无法直接编辑XML,因此错误太多。

+0

同意 - 让用户直接编辑app.config会要求麻烦,因为处理任何可能导致的异常都很困难。如果您自己推出自己的serlializable类并管理其存储空间,则处理异常情况会更容易。 – 2013-03-23 10:35:59

+0

有趣,没有考虑到。我想我会推出我自己的格式,因为我不太喜欢手工修改XML,我不确定我需要多少参数(可能是吨) – Haedrian 2013-03-23 11:09:23

+0

什么反对滚动你的自己的格式,但是,请注意,您还需要推出自己的序列化程序。 .NET有很好的XML支持,可以做出像这样微不足道的事情。 – James 2013-03-23 11:16:34

1

您可以使用应用程序(或用户)设置来保留用户可能想要在配置中进行的任何更改。请参阅ApplicationSettingsBase类和this article。 说你的应用程序包含一个用户设置所谓Score,内部管理由一个名为MyUserSettings类:

public class MyUserSettings : ApplicationSettingsBase 
{ 
    [UserScopedSetting()] 
    [DefaultSettingValue(0)] 
    public int Rank 
    { 
     get 
     { 
      return (int)this["Score"]; 
     } 
     set 
     { 
      this["Score"] = value; 
     } 
    } 
} 

您可以保存当前值,通常发生在主窗体关闭,使用Save方法:

myUserSettings.Save(); 

如果您希望用户直接修改某些设置,则可以使用属性网格或您自己的表单来绑定MyUserSettings类的实例。 如果设置被标记为“用户”,那么这些值将被存储在user.config文件中,%InstallRoot%\Documents and Settings\username\Local Settings%InstallRoot%\Documents and Settings\username\Application Data(用于漫游配置文件)。