VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#教程 >
  • C#教程之C#教程之C#应用程序配置文件App.config使用总结

本站最新发布   C#从入门到精通
试听地址  
https://www.xin3721.com/eschool/CSharpxin3721/

项目添加引用System.Configuration.dll,using System.Configuration;

应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的。

configuration是根节点,我们经常访问的是appSettings,它是由.Net预定义配置节所有的配置项都在<configuration>标签下面

<connectionStrings>节点,专门用于配置数据库连接字符串。它下面可以使用<Add>节点来添加多个数据库连接字符串。形如:

复制代码
 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3     <connectionStrings>
 4         <add name="conn" connectionString="this is connection string"/>
 5     </connectionStrings>
 6     <appSettings>
 7         <add key="key1" value="value1" />
 8         <add key="key2" value="value2" />
 9     </appSettings>
10 </configuration>
复制代码
复制代码
 1 // ConfigurationManager.ConnectionStrings是一个ConnectionStringSettingsCollection对象
 2 //获取每个连接字符串,每个ConnectionStringSettings对象有Name和ConnectionString属性
 3 for (int i = 0; i < ConfigurationManager.ConnectionStrings.Count; i++)
 4 {
 5     string name = ConfigurationManager.ConnectionStrings[i].Name;
 6     string connectionString = ConfigurationManager.ConnectionStrings[i].ConnectionString;
 7     Console.WriteLine(i.ToString() + ". " + name + " = " + connectionString);
 8 }//每个ConnectionStringSettings对象有Name和ConnectionString属性
 9 foreach (ConnectionStringSettings conn in ConfigurationManager.ConnectionStrings)
10 {
11     string name = conn.Name;
12     string connectionString = conn.ConnectionString;
13     Console.WriteLine(name + " = " + connectionString);
14 }
15 
16 //AppSettings是NameValueConnection类型,使用AllKeys返回一个所有Key组成的字符串数组
17 string[] keys = ConfigurationManager.AppSettings.AllKeys;
18 for (int i = 0; i < keys.Length; i++)
19 {
20     string key = keys[i];
21     //通过Key来索引Value
22     string value = ConfigurationManager.AppSettings[key];
23     Console.WriteLine(i.ToString() + ". " + key + " = " + value);
24 }
复制代码

修改配置文件:

  错误方法:

复制代码
 1 private void AccessAppSettings()
 2 {
 3     //获取Configuration对象
 4     Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
 5     //根据Key读取<add>元素的Value
 6     string name = config.AppSettings.Settings["name"].Value;
 7     //写入<add>元素的Value
 8     config.AppSettings.Settings["name"].Value = "fx163";
 9     //增加<add>元素
10     config.AppSettings.Settings.Add("url", "http://www.fx163.net");
11     //删除<add>元素
12     config.AppSettings.Settings.Remove("name");
13     //一定要记得保存,写不带参数的config.Save()也可以
14     config.Save(ConfigurationSaveMode.Modified);
15     //刷新,否则程序读取的还是之前的值(可能已装入内存)
16     System.Configuration.ConfigurationManager.RefreshSection("appSettings");
17 }
复制代码
 虽然程序运行时的值已经被修改。但是打开app.config查看,会看到值仍然没有被改动。如果重启程序,就会使用以前的旧值。用这种方法只可以读取值。不能写入或者修改值。

   正确方法:把配置文件按照普通的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来获取当前运行程序的配置文件。

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

 

参考:C# winform把新值写入app.config文件 - CSDN博客  https://blog.csdn.net/xiangxianghehe/article/details/77825868

   C#的配置文件App.config使用总结 - CSDN博客  https://blog.csdn.net/celte/article/details/9749389

相关教程