当前位置:   article > 正文

C# 配置文件App.config的使用操作

app.config
       应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序。
配置文件的根节点是configuration。我们经常访问的是appSettings,它是由.Net预定义配置节。我们经常使用的配置文件的架构是象下面的形式。
先大概有个印象,通过后面的实例会有一个比较清楚的认识。下面的“配置节”可以理解为进行配置一个XML的节点。 
1. 
 向项目添加 app.config 文件:
右击项目名称,选择“添加”→“添加新建项”,在出现的“添加新项”对话框中,选择“添加应用程序配置文件”;如果项目以前没有配置文件,则默认的文件名称为“ app.config ”,单击“确定”。出现在设计器视图中的app.config 文件为:
<? xml version = "1.0 "encoding = "utf-8 " ?>
< configuration >
</ configuration >

在项目进行编译后,在 bin/Debuge 文件下,将出现两个配置文件 ( 以本项目为例 ) ,一个名为“Demo.EXE.config ”,另一个名为“ Demo.vshost.exe.config ”。第一个文件为项目实际使用的配置文件,在程序运行中所做的更改都将被保存于此;第二个文件为原代码“ app.config ”的同步文件,在程序运行中不会发生更改。

2:App.config配置文件的简单使用
   2.1 向App.config配置文件添加参数

    2.2 添加System.Configuration引用
    2.3 访问App.config配置文件中的参数值
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Xml;
  6. using System.Configuration;
  7. namespace Demo
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. string serverIP = ConfigurationManager.AppSettings["ServerIP"];
  14. string dataBase = ConfigurationManager.AppSettings["DataBase"];
  15. string user = ConfigurationManager.AppSettings["user"];
  16. string password = ConfigurationManager.AppSettings["password"];
  17. Console.WriteLine(serverIP);
  18. Console.WriteLine(dataBase);
  19. Console.WriteLine(user);
  20. Console.WriteLine(password);
  21. Console.ReadKey();
  22. }
  23. }
  24. }
结果如下:

但是要想调用ConfigurationManager必须要先在工程里添加system.configuration程序集的引用。
(在解决方案管理器中右键点击工程名称,在右键菜单中选择添加引用,.net 标签页下即可找到)


3:获取 App.config配置文件中 所有Key的Value集合
  1. // 所有的Key遍历出后保存在一个容器里(例如:数组),然后用Key匹配找出Value即可
  2. static void Main(string[] args)
  3. {
  4. //判断App.config配置文件中是否有Key(非null)
  5. if (ConfigurationManager.AppSettings.HasKeys())
  6. {
  7. List<string> theKeys = new List<string>(); //保存Key的集合
  8. List<string> theValues = new List<string>(); //保存Value的集合
  9. //遍历出所有的Key并添加进theKeys集合
  10. foreach (string theKey in ConfigurationManager.AppSettings.Keys)
  11. {
  12. theKeys.Add(theKey);
  13. }
  14. //根据Key遍历出所有的Value并添加进theValues集合
  15. for (int i = 0; i < theKeys.Count; i++)
  16. {
  17. foreach (string theValue in ConfigurationManager.AppSettings.GetValues(theKeys[i]))
  18. {
  19. theValues.Add(theValue);
  20. }
  21. }
  22. //验证一下
  23. Console.WriteLine("*************Key*************");
  24. foreach (string s in theKeys)
  25. {
  26. Console.WriteLine(s);
  27. }
  28. Console.WriteLine("************Value************");
  29. foreach (var item in theValues)
  30. {
  31. Console.WriteLine(item);
  32. }
  33. }
  34. Console.ReadKey();
  35. }

结果如下:


4:App.config配置文件的修改及保存
很多文章都介绍用下面的方法修改app.config中的值:
  1. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
  2. config.AppSettings.Settings["user"].Value = "demo";
  3. 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. }

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

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

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


5:app.config、exe.config和vshost.exe.config作用区别

vshost.exe.config是程序运行时的配置文本;

exe.config是程序运行后会复制到vshost.exe.config;
app.config是在vshost.exe.config和exe.config都没有的情况下起作用,从app.config复制到exe.config再复制到vshost.exe.config

写配置文件都是写到exe.config文件中了,app.config不会变化。
app.config只在exe.config丢失的情况下在开发环境中重新加载app.config,vshost.exe.config和exe.config会自动创建,内容跟app.config一样。

vshost.exe.config和app.config两个文件可不要,但exe.config文件不可少。


更多参考:

C# 读取保存App.config配置文件




声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/239431
推荐阅读
相关标签
  

闽ICP备14008679号