配置管理器.AppSettings - 如何修改和保存?

100

可能听起来太琐碎了,我做了与文章建议相同的事情,但效果并不如预期。希望有人能指引我正确的方向。

我想按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文件夹中?


3
它将出现在可执行文件所在的文件夹中。因此,如果您在Visual Studio下运行它且处于调试模式,则会出现在项目的Debug文件夹中。 - Justin
1
同 Justin 所说。如果你是从 Visual Studio 运行的话,每次重新运行应用程序时它都会覆盖项目 Debug 文件夹中的 .config 文件。 - Welton v3.62
我在一些 jQuery 代码中发现了这个看起来很奇怪的东西: var calendar_src = '/@ConfigurationManager.AppSettings["ThisApp"]/Content/Images/calendar_icon_blue.png'; 为什么不直接写 var calendar_src = 'Content/Images/calendar_icon_blue.png'; 呢? - B. Clay Shannon-B. Crow Raven
1
http://geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspx 希望这可以帮到你 :) - Thomas
显示剩余2条评论
9个回答

116

我知道我来晚了 :) 但是这就是我做事的方式:

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


4
需要注意的一点是,如果您在调试器(Visual Studio内)中运行此操作,则每次构建时都会覆盖app.config文件。最好的方法是构建应用程序,然后导航到输出目录并从那里启动可执行文件进行测试。 - yu yang Jian
1
在 .NET 6 Winforms 中运行良好。 - Mariusz
我知道这是一个古老的问题,但当我在Webforms应用程序中使用它来获取Webconfig中的appsettings时,在我的本地实例上它可以正常工作,但在服务器上,我会在configFile.Save(ConfigurationSaveMode.Modified);处得到一个空引用异常。我之前已经检查了null的config,它不是null,并且还适当地获取和设置给定键的设置对象,所以我无法理解为什么会出现空引用异常... - Levi Wallach

73

如何修改应用程序配置文件中appSettings部分的值:

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

能完成任务。

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


4
在查看了国内外无数个AppSettings修改的想法后,这是最简单/最好的方法,并且(关键是)即使用户删除了<appSettings>节点,它仍然可以正常工作。 - downwitch

43

建议使用 <appSettings> 而不是 <customUserSetting> 部分。使用 (Web)ConfigurationManager 更容易阅读和编写。 ConfigurationSection、ConfigurationElement 和 ConfigurationElementCollection 需要您派生自定义类并实现自定义 ConfigurationProperty 属性,对于普通人来说过于繁琐。

以下是读写 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>

我已经在C:中部署了我的应用程序,使用安全性用户:完全访问权限授予对应用程序根文件夹的访问权限,但我的应用程序仍然显示配置文件访问被拒绝的异常。使用不同位置(如% appdata%)保存数据并检索相同的数据是否比使用C:更好? - Pranesh Janarthanan

26

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

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

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

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

在“添加新项目”菜单中查找设置文件。


1
添加一个Settings.Settings文件或使用位于Properties/Settings.settings下的现有文件是一样的,对吧? 如果使用现有文件,我会这样做: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save(); - Houman
1
很有可能。我一直都是使用单独的文件,效果还不错。如果是这种情况,那我刚刚学到了一些东西。 - Dan
有趣的是,如果您同时使用ConfigurationManager,那么所有设置最终都会以不同的部分出现在App.config文件中。我原本期望有两个不同的文件。 - RyanfaeScotland
我简直不敢相信我一直在循环遍历一个XML文件。非常感谢您提供这个有用的提示! - Smitty-Werben-Jager-Manjenson

24

既然基本问题涉及到Windows表单,这里是解决方案:(我只是按照用户1032413的建议更改了代码以反映Windows Forms设置)如果这是一个新的关键字:

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);

10
尝试在保存之后添加这个。
ConfigurationManager.RefreshSection( "appSettings" );

1
这一点尤为重要,尤其是在短时间内频繁地向同一个 appSetting 写入然后读取时。 - Trevor

6

请记住,ConfigurationManager仅使用一个app.config - 即启动项目中的一个。

如果您将某些app.config放入解决方案A并从另一个解决方案B中引用它,则如果您运行B,则将忽略A中的app.config。

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


2

我认为问题在于在调试Visual Studio时,它不使用普通的exeName。

它使用的是 "NameApplication".host.exe。

因此,配置文件的名称是 "NameApplication".host.exe.config 而不是 "NameApplication".exe.config。

应用程序关闭后,它会返回到原来的app.config文件。

因此,如果您检查了错误的文件或者在错误的时间进行了检查,您会发现什么也没有改变。


-2

您可以手动更改它:

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接