ConfigurationManager.AppSettings - 如何修改和保存?

时间:2011-03-11 15:27:44

标签: c# .net appsettings configurationmanager settings

这可能听起来太琐事了,而且我做了与文章中建议相同的事情,但它没有按预期工作。希望有人能指出我正确的方向。

我想保存每个AppSettings的用户设置。

Winform关闭后,我触发:

conf.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

因此第一次当条目不存在时,它只会创建它,否则它会修改现有条目。但是这不能保存。

1)我做错了什么?

2)我希望在哪里再次保存应用设置的用户设置?是在Debug文件夹中还是在C:\ Documents and Settings \ USERNAME \ Local Settings \ Application Data文件夹中?

10 个答案:

答案 0 :(得分:65)

关于如何更改app.config文件中appSettings部分中的值:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

完成这项工作。

当然,更好的做法是设置类,但这取决于你追求的是什么。

答案 1 :(得分:55)

我知道我迟到了:)但是我这样做了:

public static void AddOrUpdateAppSettings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}

有关详细信息,请查看MSDN

答案 2 :(得分:39)

首选<appSettings><customUserSetting>部分。使用(Web)ConfigurationManager读取和写入要容易得多。 ConfigurationSection,ConfigurationElement和ConfigurationElementCollection要求您派生自定义类并实现自定义ConfigurationProperty属性。对于仅仅是日常生活的IMO来说太过分了。

以下是读取和写入web.config的示例:

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

在:

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

后:

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

答案 3 :(得分:23)

因为基本问题是关于win表格的解决方案: (我刚用user1032413更改了代码以反映windowsForms设置) 如果它是一把新钥匙:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

如果密钥已存在:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);

答案 4 :(得分:22)

也许您应该考虑添加设置文件。 (例如App.Settings) 创建此文件将允许您执行以下操作:

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

这意味着您可以编辑然后更改项目,其中项目是强类型的,最重要的是......在部署之前,您不必触摸任何xml!

结果是应用程序或用户上下文设置。

查看设置文件的“添加新项目”菜单。

答案 5 :(得分:9)

public void ApplySettings(string key, string value)
{

        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
}

答案 6 :(得分:7)

尝试在保存电话后添加此内容。

ConfigurationManager.RefreshSection( "appSettings" );

答案 7 :(得分:6)

请记住,ConfigurationManager只使用一个app.config - 一个在启动项目中。

如果你将一些app.config放到解决方案A并从另一个解决方案B中引用它,那么如果你运行B,将忽略来自A的app.config。

因此,例如,单元测试项目应该有自己的app.config。

答案 8 :(得分:2)

我认为问题是在调试Visual Studio中不要使用普通的exeName。

它使用indtead“NameApplication”.host.exe

所以配置文件的名称是“NameApplication”.host.exe.config而不是 “NameApplication名为” .exe.config

在应用程序关闭后 - 它返回到后面的app.config

因此,如果您检查错误的文件或检查错误的时间,您将看到没有任何更改。

答案 9 :(得分:0)

您可以手动更改:

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}