配置文件——App.config文件读取和修改

作普通的xml文件读取的话,首先就要知道怎么寻找文件的路径。我们知道一般配置文件就在跟可执行exe文件在同一目录下,且仅仅在名称后面添加了一个.config 因此,可以用Application.ExecuteablePath+".cofig"的方式来获得,不过更加推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile这句话来直接获取当前程序的配置文件的位置,具体原因,后面再叙述。

现在回过头还是看上面的这个函数,看它的最后一行,它的作用是什么?

查找msdn文档可以发现微软出于性能考虑,对配置文件App.config采用了缓存策略,因此,尽管上面的函数确实在磁盘文件中修改了节点的值,但是,当用前面的那个函数读取的时候,会依然得到原来的那个值,仿佛没有修改一样!所以,必须使用这么句话,进行一遍刷新,强制要求程序下一次读取的时候,从磁盘文件读取!

好了,现在使用Visual Studio写C#程序的童鞋应该都遇到了一个蛋疼的问题,就是在debug时,明明在程序中修改了配置文件,可是下次重新执行程序的时候,发现程序根本没有发生变化,打开与exe文件相对应的config文件查看,发现文件根本没有变化!!!!明明就是当作xml文件来操作的,怎么会这样?!

其实这就涉及VS的运行机制问题了,细心的童鞋会在exe文件的同目录下,发现有一个与之对应的vshost.exe,以及vshost.exe.config 文件,当打开这里的这个config文件后会发现,在这里面的xml文件的值发生了变化!对滴~VS无论在Debug还是Release下,运行的程序都是这个带有vshost的程序,修改的也是这个程序对应的config。当程序刚刚启动的时候,却是读取的原来与exe文件对应的config文件,将这个config文件内容替换原来与vshost.exe对应的config里面内容,这也就是为什么每次重新开程序后恢复原状的原因。

由于程序在VS里面调试的时候,运行的程序与直接去bin文件夹运行的程序不一样,所以,更推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile来获取当前运行程序的配置文件。

用了各种方法 ,还是无法修改App.config的内容,虽然vshost.exe.config  确实修改。但是下一次启动读的还是原来的config,并且还替换了已经修改的vshost.exe.config

最终采取的方案如下:

   public class AppConfigHelper
    {
        public static string GetValueByKey(string key)
        {
            ConfigurationManager.RefreshSection("appSettings");
            return ConfigurationManager.AppSettings[key];
        }
        public static void ModifyAppSettings(string strKey, string value)
        {
            //获得配置文件的全路径
            var assemblyConfigFile = Assembly.GetEntryAssembly().Location;
            var appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
            ChangeConfiguration(strKey, value, assemblyConfigFile);
            ModifyAppConfig(strKey, value, appDomainConfigFile);
        }

        private static void ModifyAppConfig(string strKey, string value, string configPath)
        {
            var doc = new XmlDocument();
            doc.Load(configPath);

            //找出名称为“add”的所有元素
            var nodes = doc.GetElementsByTagName("add");
            for (int i = 0; i < nodes.Count; i++)
            {
                //获得将当前元素的key属性
                var xmlAttributeCollection = nodes[i].Attributes;
                if (xmlAttributeCollection != null)
                {
                    var att = xmlAttributeCollection["key"];
                    if (att == null) continue;
                    //根据元素的第一个属性来判断当前的元素是不是目标元素
                    if (att.Value != strKey) continue;
                    //对目标元素中的第二个属性赋值
                    att = xmlAttributeCollection["value"];
                    att.Value = value;
                }
                break;
            }

            //保存上面的修改
            doc.Save(configPath);
            ConfigurationManager.RefreshSection("appSettings");
        }

        public static void ChangeConfiguration(string key, string value, string path)
        {
            var config = ConfigurationManager.OpenExeConfiguration(path);
            config.AppSettings.Settings.Remove(key);
            config.AppSettings.Settings.Add(key, value);
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection("appSettings");
        }
    }

虽说 app.config文件 还是无法看到修改,但是程序运行的时候实际调用的两个文件(vshost.exe.config和exe.config  )都被修改了,这样每次启动 配置文件里的内容也都是最新的,只不过如果你的程序重新生成的话,两个文件就会被app.config的内容覆盖。

仅仅是调式阶段会有一些不方便,但是一旦打包,就能够很好的使用,每次都能修改配置文件内容,并读取到最新的内容。

原文地址:https://www.cnblogs.com/DreamRecorder/p/9144586.html

时间: 2024-08-17 11:15:07

配置文件——App.config文件读取和修改的相关文章

配置文件——WebApp.config文件读取和修改

[csharp] view plain copy using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Net.Mime; using System.Text; using System.Threading.Tasks; using System.Web; using System.Xml; namespace Infrastructu

winform程序读取和改写配置文件App.config元素的值

在开发Web项目的时候,会有一个配置文件Web.config,用来存放一些全局的变量,如连接数据库用的字符串.相应的,在开发winform程序时,也有一个配置文件,它就是App.config,这个文件的作用与Web.config大致相同,也可以用来存放程序所用的全局变量及Value值. 来看一个app.config文件的例子: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighl

通过读取配置文件App.config来获取数据库连接字符串

有两种方式://通过读取配置文件来获取连接字符串 第一种方式: App.config 文件的格式: <?xml version="1.0" encoding="utf-8" ?><configuration> <connectionStrings> <add name="sqlConnStr" connectionString="Data Source=服务器名称;Initial Catalog

修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数

1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summary> 4: /// <remarks> 5: /// 注意,调用该函数后,会使整个Web Application重启,导致当前所有的会话丢失 6: /// </remarks> 7: /// <param name="key">要修改的键key

C# WinForm中 App.config 文件配置

应用程序配置文件,对于asp.net是 web.config对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本质是一个xml文件,对于配置文件的操作,从.NET 2.0 开始,就非常方便了,提供了 System [.Web] .Configuration 这个管理功能的NameSpace,要使用它,需要添加对 System.configuration.dll的引用. 对于WINFORM程序,使用 System

C#的配置文件App.config使用总结 - 转

http://blog.csdn.net/celte/article/details/9749389 首先,先说明,我使用的app.config 配置文件的格式如下: [html] view plaincopyprint? <?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServerIP" va

连接数据库通过配置文件app.config

ConfigurationManager类 public static class ConfigurationManager 命名空间: System.Configuration 程序集: System.Configuration(在 System.Configuration.dll 中) ConfigurationManager.AppSettings 属性 ConfigurationManager.ConnectionStrings 属性 获取当前应用程序默认配置的 ConnectionSt

读写app.config文件

项目中经常需要对app.config文件,从网上参考,先记录. 1.读取config文件 string color = ConfigurationManager.AppSettings["Color"]; string fontSize = ConfigurationManager.AppSettings["FontSize"]; string skin = ConfigurationManager.AppSettings["Skin"]; 2.

一步一步教你玩转.NET Framework的配置文件app.config

转自https://www.cnblogs.com/tonnie/archive/2010/12/17/appconfig.html 在一般的项目中,为了使你的代码更加灵活,更方便调整,减少不必要的hard code,我们都在config中添加许多配置信息,一般可以选择.NET自带的配置文件形式app.config或者web项目中的web.config来完成配置工作. .NET中提供了几个和配置有关的类来支持用完轻松的完成配置文件的读写设置: System.Configuration.Confi