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 - 如何修改和保存?的主要内容,如果未能解决你的问题,请参考以下文章