【问题标题】:ConfigurationManager.AppSettings - How to modify and save?ConfigurationManager.AppSettings - 如何修改和保存?
【发布时间】: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 文件夹中?

【问题讨论】:

标签: c# .net appsettings configurationmanager settings


【解决方案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($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
             File.WriteAllText(appConfigPath, newContent);
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-02
          • 2010-09-28
          • 2011-11-15
          • 1970-01-01
          • 1970-01-01
          • 2017-07-07
          • 2021-05-30
          • 2012-06-20
          • 2019-09-16
          相关资源
          最近更新 更多