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

Posted

技术标签:

【中文标题】ConfigurationManager.AppSettings - 如何修改和保存?【英文标题】:ConfigurationManager.AppSettings - How to modify and save? 【发布时间】:2011-07-13 14:07:16 【问题描述】:

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

我想保存每个 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 文件夹中?

【问题讨论】:

参考这个:***.com/questions/453161/… Best practice to save application settings in a Windows application的可能重复 它将位于可执行文件所在的文件夹中。因此,如果您从 Visual Studio 的 Debug 下运行它,它将位于项目的 Debug 文件夹中。 贾斯汀说的同上。如果您从 Visual Studio 运行,则每次重新运行应用程序时,它都会覆盖项目的 Debug 文件夹中的 .config 文件。 geekswithblogs.net/akraus1/archive/2006/01/04/64871.aspx 希望对您有所帮助:) 【参考方案1】:

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

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

【讨论】:

上面要注意的一个主要点是,如果您从调试器(在 Visual Studio 中)运行它,那么每次构建时都会覆盖 app.config 文件。最好的测试方法是构建您的应用程序,然后导航到输出目录并从那里启动您的可执行文件。 --- 来自vbcity.com/forums/t/152772.aspx【参考方案2】:

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

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

完成这项工作。

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

【讨论】:

在查看了国内外三个 kajillion AppSettings 修改想法之后,这是最简单/最好的,并且(至关重要)即使用户破坏了 节点也有效【参考方案3】:

首选<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>

【讨论】:

我在 C: 中部署了我的应用程序,我使用 Security Users:Fullaccess 授予了对应用程序根文件夹的访问权限,但我的应用程序仍然显示配置文件访问被拒绝的异常。使用 %appdata% 之类的不同位置来保存数据并检索数据而不是使用 C: 会更好吗?【参考方案4】:

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

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

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

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

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

【讨论】:

添加 Settings.Settings 文件或使用 Properties/Settings.settings 下的现有文件是一回事吗?如果使用现有的,我会这样做:Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save(); 很有可能。我一直只使用单独的文件,因为这对我很好。如果是这样的话,我刚刚学到了一些东西 令人着迷的是,如果您使用它和 ConfigurationManager,那么所有设置最终都在 App.config 文件中,但在不同的部分下。我期待 2 个不同的文件。 我不敢相信我一直在循环浏览一个 XML 文件。非常感谢这个有用的提示!【参考方案5】:

因为基本问题是关于获胜形式的,所以这里是解决方案: (我刚刚将 user1032413 的代码更改为 rflect 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);

【讨论】:

【参考方案6】:

尝试在保存调用后添加它。

ConfigurationManager.RefreshSection( "appSettings" );

【讨论】:

如果您正在快速连续地写入然后读取相同的应用设置,这一点尤其重要。【参考方案7】:

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

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

所以例如单元测试项目应该有自己的app.config。

【讨论】:

【参考方案8】:

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

它使用 indtead "NameApplication".host.exe

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

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

因此,如果您检查了错误的文件或检查了错误的时间,您会发现没有任何变化。

【讨论】:

【参考方案9】:

您可以手动更改:

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($"searchedStringcurrentValue\"", $"searchedStringnewValue\"");
     File.WriteAllText(appConfigPath, newContent);

【讨论】:

以上是关于ConfigurationManager.AppSettings - 如何修改和保存?的主要内容,如果未能解决你的问题,请参考以下文章