将键值对写入app.config文件

时间:2012-12-14 00:50:51

标签: c# winforms

它适用于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发生?谢谢。

2 个答案:

答案 0 :(得分:2)

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

应用程序设置,例如:

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

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

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

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

上面的评论触及了为什么它的工作方式:程序文件中的文件在安装后保持不变,UAC确保这一点。

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

  • 安装到用户的个人资料文件夹或
  • 始终以您的程序运行 管理员

答案 1 :(得分:0)

尝试以下代码

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