【问题标题】:Writing key value pairs into app.config file将键值对写入 app.config 文件
【发布时间】:2012-12-14 00:50:50
【问题描述】:

Read 可以正常工作,但我似乎无法让Write 发生。当我尝试写入文件时,它不会抛出任何 IO 异常。好像什么都没发生一样。

这是我的代码,请看GetValue()SetValue()函数:

using System.Configuration;

public class AppConfig {
    private string _username;
    private string _password; 

    public AppConfig() {
        _filePath = GetValue("Username");
        _password = GetValue("Password");
        //... more
    }
    public string Password {
        get { return _password; }
        set { SetValue("Password", value); _password = value; }
    }
    public string Username {
        get { return _username; }
        set { SetValue("Username", value); _username = value; }
    }
    private void SetValue(string key, string val) {
        var cfg= ConfigurationManager
                .OpenExeConfiguration(ConfigurationUserLevel.None);
        cfg.AppSettings.Settings[key].Value = val;
        cfg.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("appSettings");
    }
    private string GetValue(string key) {
        return ConfigurationManager.AppSettings[key];
    }
}

这是 app.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <appSettings>

    <add key ="Password" value ="123456"/>
    <add key ="Username" value ="hohoho"/>

  </appSettings>
</configuration>

知道如何让Write 发生吗?谢谢。

【问题讨论】:

  • config.AppSettings.Settings.Add 不会自动处理这个?还要确保文件不在 UAC 无法触及的位置(如果适用)。 (例如,应用程序从 %ProgramFiles%\YourApp 运行,但具有未提升的权限。)
  • 我正在更改代码尝试一下。是否有一个简单的解决方案可以将 app.config 重新定位到未被 UAC 阻止的地方?例如文件或一些公共文件夹?还是我必须重写我自己的配置 IO 结构,不能再使用 config.AppSettings?
  • 出于好奇,如果您使用其他 ConfigurationSaveMode 选项,您的结果如何?
  • 另外一件事——如果你在 Visual Studio 中调试,你不会看到你的配置文件被修改——它会修改 exeName.vshost.config 而不是 exeName.config 文件,并在调试完成后重置 .vshost.config 文件。

标签: c# winforms


【解决方案1】:

.Net 中的配置系统并非旨在让您以编程方式将更改保存到程序集文件夹中的 app.config。我知道那里有一个“保存”方法,但这些更改实际上保存到配置文件的副本中。副本的位置取决于设置的范围。

应用程序设置,例如:

<appSettings>
     <add key="" value=""/>
</appSettings>

如果我没记错的话,有“应用范围”。如果您使用项目设置页面中的设置页面或在属性文件夹中打开Settings.settings,您可以选择范围(用户或应用程序)。

这样,对当前用户或特定版本的应用程序的设置更改将保持不变。这些副本存储在相应帐户的 %APPDATA% 中某处的生成文件夹中。配置系统会根据登录者自动重新加载设置。

这就是为什么您还有“升级”方法。它允许您将设置添加到应用程序的新版本并升级用户的设置,从而仅将新属性添加到用户的副本中。这样,程序集文件夹中app.config中的设置就只是设置的默认值了。

上面的 cmets 谈到了为什么它是这样工作的:Program Files 中的文件旨在在安装后保持不变,UAC 确保了这一点。

我建议阅读配置系统,它非常强大。如果你还真想修改app.config,你得写自定义代码直接修改app.config文件

  • 安装到用户的个人资料文件夹中,或
  • 始终以 管理员

【讨论】:

    【解决方案2】:

    试试下面的代码

     Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.AppSettings.Settings[key].Value = value;
            config.Save();
            ConfigurationManager.RefreshSection("appSettings");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 2018-05-08
      • 2013-07-13
      • 1970-01-01
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      相关资源
      最近更新 更多