zoukankan      html  css  js  c++  java
  • C#的配置文件App.config使用总结

    http://blog.csdn.net/celte/article/details/9749389

    首先,先说明,我使用的app.config 配置文件的格式如下:

    1. <?xml version="1.0" encoding="utf-8" ?>  
    2. <configuration>  
    3.   <appSettings>  
    4.       
    5.     <add key="ServerIP" value="127.0.0.1"></add>  
    6.       
    7.     <add key="DataBase" value="WarehouseDB"></add>  
    8.   
    9.     <add key="user" value="sa"></add>  
    10.   
    11.     <add key="password" value="sa"></add>  
    12.   
    13.   </appSettings>  
    14. </configuration>  
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <appSettings>
        
        <add key="ServerIP" value="127.0.0.1"></add>
        
        <add key="DataBase" value="WarehouseDB"></add>
    
        <add key="user" value="sa"></add>
    
        <add key="password" value="sa"></add>
    
      </appSettings>
    </configuration>

    因此,对于配置文件的读取方式如下:(依然由上面的文件举一个简单的例子)

    1. static string str = "Data Source=" + System.Configuration.ConfigurationManager.AppSettings["ServerIP"] + ";Initial Catalog =" + System.Configuration.ConfigurationManager.AppSettings["DataBase"] + "; User ID=" + System.Configuration.ConfigurationManager.AppSettings["user"] + "; Password=" + System.Configuration.ConfigurationManager.AppSettings["password"] ;  
    static string str = "Data Source=" + System.Configuration.ConfigurationManager.AppSettings["ServerIP"] + ";Initial Catalog =" + System.Configuration.ConfigurationManager.AppSettings["DataBase"] + "; User ID=" + System.Configuration.ConfigurationManager.AppSettings["user"] + "; Password=" + System.Configuration.ConfigurationManager.AppSettings["password"] ;

    这样,便从配置文件中读取出了所需要的信息,组成了一组用于连接数据库的字符串。

    对于修改配置文件 的话,

    很多文章都介绍用下面的方法修改app.config中的值:

    1. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
    2. config.AppSettings.Settings["DB_UID"].Value = "demo";  
    3. config.Save(ConfigurationSaveMode.Full);  
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    config.AppSettings.Settings["DB_UID"].Value = "demo";
    config.Save(ConfigurationSaveMode.Full);

    事实证明这种做法是不可行的。虽然程序运行时的值已经被修改。但是打开app.config查看,会看到值仍然没有被改动。如果重启程序,就会使用以前的旧值。用这种方法只可以读取值。不能写入或者修改值。

    注意,正确的做法是,把配置文件按照普通的xml文件来进行修改,否则,经常出现的问题就是你所修改的东西其实最后根本没有写入文件!最后还是修改失败!

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

    这里给出我常用的操作函数。

    1. using System.Xml;  
    2. //第一个参数是xml文件中的add节点的value,第二个参数是add节点的key  
    3. private void SaveConfig(string ConnenctionString, string strKey)  
    4. {  
    5.             XmlDocument doc = new XmlDocument();  
    6.             //获得配置文件的全路径  
    7.             string strFileName = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;  
    8.             // string  strFileName= AppDomain.CurrentDomain.BaseDirectory + "\exe.config";  
    9.             doc.Load(strFileName);  
    10.             //找出名称为“add”的所有元素  
    11.             XmlNodeList nodes = doc.GetElementsByTagName("add");  
    12.             for (int i = 0; i < nodes.Count; i++)  
    13.             {  
    14.                 //获得将当前元素的key属性  
    15.                 XmlAttribute att = nodes[i].Attributes["key"];  
    16.                 //根据元素的第一个属性来判断当前的元素是不是目标元素  
    17.                 if (att.Value == strKey)  
    18.                 {  
    19.                     //对目标元素中的第二个属性赋值  
    20.                     att = nodes[i].Attributes["value"];  
    21.                     att.Value = ConnenctionString;  
    22.                     break;  
    23.                 }  
    24.             }  
    25.             //保存上面的修改  
    26.             doc.Save(strFileName);  
    27.             System.Configuration.ConfigurationManager.RefreshSection("appSettings");  
    28. }  
    using System.Xml;
    //第一个参数是xml文件中的add节点的value,第二个参数是add节点的key
    private void SaveConfig(string ConnenctionString, string strKey)
    {
                XmlDocument doc = new XmlDocument();
                //获得配置文件的全路径
                string strFileName = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
                // string  strFileName= AppDomain.CurrentDomain.BaseDirectory + "\exe.config";
                doc.Load(strFileName);
                //找出名称为“add”的所有元素
                XmlNodeList nodes = doc.GetElementsByTagName("add");
                for (int i = 0; i < nodes.Count; i++)
                {
                    //获得将当前元素的key属性
                    XmlAttribute att = nodes[i].Attributes["key"];
                    //根据元素的第一个属性来判断当前的元素是不是目标元素
                    if (att.Value == strKey)
                    {
                        //对目标元素中的第二个属性赋值
                        att = nodes[i].Attributes["value"];
                        att.Value = ConnenctionString;
                        break;
                    }
                }
                //保存上面的修改
                doc.Save(strFileName);
                System.Configuration.ConfigurationManager.RefreshSection("appSettings");
    }

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

    查找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来获取当前运行程序的配置文件。

    当然啦,这一点差异不要着急,等程序调试完毕后,以后,程序一般就是从文件夹手动启动的啦,这个时候,就没有上面的那么多问题的了。一切会恢复正常!

  • 相关阅读:
    001 云开发基础
    HttpClient 调用外部接口(简单实用)
    MD5加密(简单实现_可自行扩展)
    SAA C02考点梳理
    支配树
    CF1320E 题解
    dp套dp
    20210705模拟赛总结
    20210703模拟赛
    20210629模拟赛总结
  • 原文地址:https://www.cnblogs.com/viviancc/p/3944743.html
Copyright © 2011-2022 走看看