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


81

听起来似乎太琐碎了,我做了文章中建议的相同操作,但没有按预期工作。希望有人能指出我正确的方向。

我想保存每个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在“调试”下运行它,它将位于项目的“调试”文件夹中。
贾斯汀

1
同上贾斯汀说的话。而且,如果您从Visual Studio运行,则每次重新运行应用程序时,它将覆盖项目的Debug文件夹中的.config文件。
Welton v3.60

Answers:


25

也许您应该看看添加设置文件。(例如,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 2011年

1
很有可能。我一直只使用单独的文件,因为这样做很好。如果是这样,我刚刚学到了一些东西

令人着迷的是,如果您使用此AND ConfigurationManager,则所有设置最终都会出现在App.config文件中,但位于不同部分下。我期待2个不同的文件。
RyanfaeScotland

我不敢相信我一直都在遍历XML文件。非常感谢这个有用的提示!
Smitty-Werben-Jager-Manjenson,

78

我知道我迟到了:)但是,我该怎么做:

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。


3
上面提到的一个主要要点是,如果从调试器(在Visual Studio中)运行此文件,则每次构建时app.config文件都会被覆盖。最好的测试方法是构建应用程序,然后导航到输出目录并从此处启动可执行文件。---来自vbcity.com/forums/t/152772.aspx
洋剑

69

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

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

做这份工作。

当然,更好的做法是设置类,但这取决于您的工作。


4
在研究了国内外3亿个AppSettings修改想法之后,这是最简单/最好的方法,并且即使用户销毁<appSettings>节点,也(至关重要)有效
downwitch 2014年

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>

23

因为基本问题是有关赢取表格的,这里是解决方法:(我刚刚通过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);

8

尝试在保存呼叫之后添加此内容。

ConfigurationManager.RefreshSection( "appSettings" );

1
如果要先编写然后快速连续读取相同的appSetting,则这尤其重要。
Trevor 2015年

6

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

如果将一些app.config放入解决方案A并从另一个解决方案B对其进行引用,则如果您运行B,则来自A的app.config将被忽略。

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


2

我认为问题在于在Visual Studio调试中不要使用正常的exeName。

它使用indtead“ NameApplication” .host.exe

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

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

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


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);
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.