c#中配置文件的使用(一)

本文介绍了在C#中如何使用配置文件,包括直接使用appsettings和connectionStrings节,程序运行时修改配置,以及自定义配置节。通过示例代码展示了读取和更新配置文件的方法,强调了调试时配置文件的注意事项。

     在使用log4net的时候,需要自己来配置相关的文件,之前虽然研究过如何来使用配置文件,但是时间一久还是有点生疏,下面自己做的一些小test,也让自己能够有比较深的印象,在学习过程中,也在网上看到了一位大神写的相关的内容,比较详细,这是大神博客关于配置文件的地址http://www.cnblogs.com/kissdodog/archive/2013/04/11/3014227.html,然后根据这个我自己做了一些尝试,并写出自己的理解和体会。

    在vs中,创建一个项目,然后就会生成一个app.config的配置文件,可以在这个配置文件中设置,当然也可以自己写配置文件,然后自己去封装一下,模仿app.config的各项功能实现方法即可,下面的test都是在app.config文件中实现的。

   1. 直接使用appsettings和connectionStrings节,如果是不太复杂的配置文件,使用这2个节就够用了,下面是一个简单的例子

  

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="User1" value="password1"/>
    <add key="User2" value="password2"/>
    <add key="User3" value="password3"/>
  </appSettings>
  <connectionStrings>
    <add name ="sqlite" connectionString ="dataSource = /数据库/db"/>
  </connectionStrings>
    
</configuration>

上面的配置文件的写法还是比较好理解的,我需要3个配置项User1,User2,User3,其对应的value分别为password1,password2,password3,在下面的代码中,可以很简单的就能读取出来上面所写的配置项。

public void Test1()
        {
            var password1 = ConfigurationManager.AppSettings["User1"];
            var password2 = ConfigurationManager.AppSettings["User2"];
            var password3 = ConfigurationManager.AppSettings["User3"];
            Console.WriteLine(password1 + '\n' + password2 + '\n' + password3 + '\n');
            var connectionString = ConfigurationManager.ConnectionStrings["sqlite"];
            Console.WriteLine(connectionString);
        }

上面的程序运行的代码结果,就是显示了对应的配置项的value,这样就可以用于在刚打开程序的时候,对某些变量进行赋值了。

2. 有时会在程序中对配置文件进行修改,可以按照下面的方法来

static void Main(string[] args)
        {
            Configuration cfa = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); //首先打开配置文件
            cfa.AppSettings.Settings.Add("User4", "password4");  //向配置文件中添加一个新的项
            cfa.AppSettings.Settings["User1"].Value = "password5";//修改配置文件中的某一个项的value
            cfa.Save();  //保存配置文件
            ConfigurationManager.RefreshSection("appSettings");  //刷新配置文件
        }
在调试上面代码的时候发现,app.config没有发生变化,但是在生成的应用程序里面打开的时候,发现config文件是发生 了变化的,之前在查找相关信息的时候,网上很多都说这样修改是不对的,是无法实现的,所以很多就用xml方面的操作方法来进行了修改(这个在后面的学习中会做一个总结)。

但是其实原因在于:在我们调试的时候,编译器会把debug下的exe,dll,config给覆盖掉。执行代码时候,其实是将debug目录下的config内容改变。而项目下的app.config文件并没有改变。。。所以再次进行调试的时候debug下的config又被项目下的app.config覆盖。

3. vs自带的handler可以用来自定义一些配置节

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections> <!--这个节其实就是用来设置下面的自定义节的名字和相关的类型-->
    <section name="UserName" type="System.Configuration.NameValueSectionHandler"/>  <!--返回Name Value类型形式的节-->
    <section name="UserAge" type="System.Configuration.DictionarySectionHandler"/> <!--返回字典类型形式的节-->
    <section name="UserHeight" type="System.Configuration.SingleTagSectionHandler"/> <!--基础结构。处理 .config 文件中由单个 XML 标记所表示的各配置节。-->
  </configSections>
  
  <UserName>
    <add key="1" value="王二"/>
    <add key="2" value="张三"/>
    <add key="3" value="李四"/>
  </UserName>
  
  <UserAge>
    <add key="1" value="23"/>
    <add key="2" value="24"/>
    <add key="3" value="25"/>
  </UserAge>
  
  <UserHeight one="170" two="180" three="190"/>
  
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>  

上面自定了三个节,类型分别为NameValue的表示形式,dictionary的表示形式,还有个是最基础的结构,类似于appsettings节,写上相应的配置信息,然后就可以调用了

public static void Test2()
        {
            var section1 = (NameValueCollection)ConfigurationManager.GetSection("UserName");  //首先要获取对应的配置节
            var name1 = section1["1"];  //这边也可以使用section1.Allkeys来遍历,这边是为了说明如果知道key的值,可以直接获得对应的Value值
            var name2 = section1["2"];
            var name3 = section1["3"];
            Console.WriteLine(name1 + "," + name2 + "," + name3);

            var section2 = (IDictionary) ConfigurationManager.GetSection("UserAge");
            foreach (var key in section2.Keys)  //这边因为是字典,因此遍历是使用keys,跟上面的Allkeys不一样。
            {
                Console.WriteLine(section2[key]);
            }

            var section3 = (IDictionary) ConfigurationManager.GetSection("UserHeight");
            foreach (var key in section3.Keys)
            {
                Console.WriteLine(section3[key]);
            }
        }

通过上面的例子可以知道,通过系统提供的handler,除了这3个还有很多,我们可以自己来创建一些配置节,并且设置节的属性,这样可以更好的把不同功能或者不同类型的配置信息区分开来。另外根据自己的需要选择不同的handler,这样在应用配置文件的时候也能根据需要更简单的获得自己想要的信息。

4. 如果觉得系统的handler不能满足自己的要求,这时候可以自定义handler

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="Person" type="Test2.PersonHandler,Test2"/> <!--type后面第一个参数是该节定义的位置,第二个参数是该节所在的程序集-->
  </configSections>
  <Person age="25" name="User1"/>  <!--Person中使用2个hashtable,第一层key是Person,后面的内容是value.第二层key是age和name,值是value-->
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

具体的使用代码如下,其实跟使用系统自带的handler使用方法类似,通俗点说就跟压缩软件一样的就是怎么压缩的,使用同样的方法再解压缩得到想要的值就可以了

class Program
    {
        static void Main(string[] args)
        {
            Hashtable section = ConfigurationManager.GetSection("Person") as Hashtable; //跟上面一样获取section,不过这个section是hashtable类型的。
            if (section != null)
                foreach (DictionaryEntry key in section)      //第一层table
                {
                    Hashtable attrs = (Hashtable) key.Value; //根据key,来获取对应的value,而这个value又是第2层hashtable
                    foreach (DictionaryEntry attr in attrs)
                    {
                        Console.WriteLine(attr.Key);    //解析第2层hashtable就可以得到配置文件中Person节中的信息了。
                        Console.WriteLine(attr.Value);
                    }
                }
        }
    }

    class PersonHandler : IConfigurationSectionHandler
    {
        public object Create(object parent, object configContext, XmlNode section)
        {
            Hashtable configSection = new Hashtable();
            Hashtable configAttribute = new Hashtable();
            if (section.Attributes != null)
            {
                foreach (XmlAttribute attribute in section.Attributes)
                {
                    if (attribute.NodeType == XmlNodeType.Attribute)
                    {
                        configAttribute.Add(attribute.Name, attribute.Value);
                    }
                }
            }
            configSection.Add(section.Name, configAttribute);
            return configSection;    
        }
    }


配置文件概述: 应用程序配置文件是标准的XML 文件 XML 标记和属性是区分大小写的 它是可以 按需要更改的 开发人员可以使用配置文件来更改设置 而不必重编译应用程序 配置 文件的根节点是configuration 我们经常访问的是appSettings 它是由 Net 预定义配置 节 我们经常使用配置文件的架构是象下面的形式 先大概有个印象 通过后面的实 例会有个比较清楚的认识 下面的“配置节”可以理解为进行配置个XML 的节点 常见配置文件模式: <configuration> <configSections> 配置节声明区域 包含配置节和命名空间声明 <section> 配置节声明 <sectionGroup> 定义配置节组 <section> 配置节组中的配置节声明 <appSettings> 预定义配置节 <Custom element for configuration section> 配置节设置区域 2 只有appSettings 节的配置文件及访问方法 下面是个最常见的应用程序配置文件的例子 只有appSettings 节 < xml version "1 0" encoding "utf 8" > <configuration> <appSettings> <add key "connectionstring" value "User ID sa;Data Source ;Password ;Initial C atalog test;Provider SQLOLEDB 1;" > <add key "TemplatePATH" value "Template" > < appSettings> < configuration> 下面来看看这样的配置文件如何方法 string connectionString ConfigurationSettings AppSettings["connectionstring"]; 使用ConfigurationSettings 类的静态属性AppSettings 就可以直接方法配置文件中的配置 信息 这个属性的类型是NameValueCollection 3 自定义配置文件 3 1 自定义配置节 个用户自定义的配置节 在配置文件中分为两部分:是在<configSections>< confi gSections>配置节中声明配置节(上面配置文件模式中的“<section>”) 另外是在<confi gSections>< configSections >之后设置配置节(上面配置文件模式中的“<Custom eleme nt for configuration section>”) 有点类似个变量先声明 后使用样 声明个配 置文件的语句如下: <section name " " type " " > <section>:声明新配置节 即可创建新配置节 P> name:自定义配置节的名称 type:自定义配置节的类型 主要包括System Configuration SingleTagSectionHandler S ystem Configuration DictionarySectionHandler System Configuration NameValueSectionHa ndler 不同的type 不但设置配置节的方式不样 最后访问配置文件的操作上也有差异 下面 我们就举配置文件的例子 让它包含这三个不同的type < xml version "1 0" encoding "utf 8" > <configuration> <configSections> <section name "Test1" type "System Configuration SingleTagSectionHandler" > <section name "Test2" type "System Configuration DictionarySectionHandler" > <section name "Test3" type "System Configuration NameValueSectionHandler" > < configSections> <Test1 setting1 "Hello" setting2 "World" > <Test2> <add key "Hello" value "World" > < Test2> <Test3> <add key "Hello" value "World" > < Test3> < configuration> 我们对上面的自定义配置节进行说明 在声明部分使用<section name "Test1" type "Sy stem Configuration SingleTagSectionHandler" >声明了个配置节它的名字叫Test1 类型 为SingleTagSectionHandler 在设置配置节部分使用<Test1 setting1 "Hello" setting2 "World" >设置了个配置节 它的第个设置的值是Hello 第二个值是World 当然 还可以有更多 其它的两个配置节和这个类似 下面我们看在程序中如何访问这些自定义的配置节 我们用过ConfigurationSettings 类 的静态方法GetConfig 来获取自定义配置节的信息 public static object GetConfig string sectionName ; 下面是访问这三个配置节的代码: 访问配置节Test1 IDictionary IDTest1 IDictionary ConfigurationSettings GetConfig "Test1" ; string str string IDTest1["setting1"] +" "+ string IDTest1["setting2"]; MessageBox Show str ; 输出Hello World 访问配置节Test1 的方法2 string[] values1 new string[IDTest1 Count]; IDTest1 Values CopyTo values1 0 ; MessageBox Show values1[0]+" "+values1[1] ; 输出Hello World 访问配置节Test2 IDictionary IDTest2 IDictionary ConfigurationSettings GetConfig "Test2" ; string[] keys new string[IDTest2 Keys Count]; string[] values new string[IDTest2 Keys Count]; IDTest2 Keys CopyTo keys 0 ; IDTest2 Values CopyTo values 0 ; MessageBox Show keys[0]+" "+values[0] ; 访问配置节Test3 NameValueCollection nc NameValueCollection ConfigurationSettings GetConfig "Test3" ; MessageBox Show nc AllKeys[0] ToString +" "+nc["Hello"] ; 输出Hello Wor ld 通过上面的代码我们可以看出 不同的type 通过GetConfig 返回的类型不同 具体获得 配置内容的方式也不样 配置节处理程序 返回类型 SingleTagSectionHandler Systems Collections IDictionary DictionarySectionHandler Systems Collections IDictionary NameValueSectionHandler Systems Collections Specialized NameValueCollection 3 2 自定义配置节组 配置节组是使用<sectionGroup>元素 将类似的配置节分到同个组中 配置节组声明 部分将创建配置节的包含元素 在<configSections>元素中声明配置节组 并将属于该组 的节置于<sectionGroup>元素中 下面是个包含配置节组的配置文件的例子: < xml version "1 0" encoding "utf 8" > <configuration> <configSections> <sectionGroup name "TestGroup"> <section name "Test" type "System Configuration NameValueSectionHandler" > < sectionGroup> < configSections> <TestGroup> <Test> <add key "Hello" value "World" > < Test> < TestGroup> < configuration> 下面是访问这个配置节组的代码: NameValueCollection nc NameValueCollection ConfigurationSettings GetConfig "TestGroup Test" ; MessageBox Show nc AllKeys[0] ToString +" "+nc["Hello"] ; 输出Hello Wor ld">配置文件概述: 应用程序配置文件是标准的XML 文件 XML 标记和属性是区分大小写的 它是可以 按需要更改的 开发人员可以使用配置文件来更改设置 而不必重编译应用程序 配置 文件的根节点是configuration 我们经常访问的 [更多]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值