所有与配置文件相关的类:(粗体为一般情况下使用到的类,其它类功能可能在很复杂的情况下才使用到。)

1、ConfigurationManager,这个提供用于打开客户端应用程序集的Configuration对象。
2、WebConfigurationMaManager,这个提供用于打开web应用程序集的Configuration对象。
3、ConfigurationSection ,表示配置文件中的区域对象。
4、ConfigurationSectionCollection ,表示配置文件中相关区域的集合。
5、ConfigurationSectionGroup ,表示配置文件中的一组相关区域的组对象。
6、ConfigurationSectionGroupCollection ,表示 ConfigurationSectionGroup 对象的集合。
7、ConfigurationProperty ,表示区域或元素的属性。
8、ConfigurationPropertyAttribute ,以声明方式指示 .NET Framework,以实例化配置属性。
9、ConfigurationElement ,表示配置文件中的元素对象。
10、ConfigurationElementCollection ,表示元素的集合的对象。

文章中只对粗体的类进行实践,因为已经可以涵盖80%以上的需求。

使用的需求环境:

对于在程序中用到的一些参数配置可能会随着程序的使用而改变,如果将这些参数写在代码里并编译到EXE文件中,那这些参数的改变则无法得到保存。如果下次程序启动的时候想载入改变后的参数配置则必须将这些参数配置写入到一个文件中保存。.NET中提供了一个System.Configuration.dll,这个命名空间下提供的类可以很方便的把这些参数配置读写到XML文件中。当然你也可以使用XML文档的相关操作类来实现这一功能,但如果是自己直接操作XML文档则可能得到的XML配置文件不合规。

可以直接在项目中添加类-->应用程序配置文件 直接向项目中添加一个App.config 的XML文件。当然也可以通过Configuration对象的Save()来将做好的配置对象保存在程序同目录下,它的名称则是programName.exe.config。但在程序调试的时候会出现programName.vshost.exe.config而不会出现programName.exe.config。

首先必须先了解几个名词知识:

Section 区域,它在XML文件中是除根节点外的一级节点,在它下面可以有其它子节点和元素。
Element 元素,它在XML文件中是最基本的单元,它下面不能包含其它元素。

这二个对象都可以用属性,它在XML文件中就是在标签内部的属性内容。

看一下下面这个XML配置文件的内容

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="section1" type="OracleDataConvertTxt.AppSectionA, OracleDataConvertTxt, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<section name="SectionA" type="OracleDataConvertTxt.AppSectionB, OracleDataConvertTxt, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<section name="SectionB" type="OracleDataConvertTxt.AppSectionB, OracleDataConvertTxt, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</configSections>
<appSettings>
<add key="huangbo" value="1234567890" />
</appSettings>
<connectionStrings>
<add name="连接的名称,就类同于Key" connectionString="具体的连接字符串" providerName="与连接字符串一起使用的提供程序的名称。这个有时可以没有" />
</connectionStrings>
<section1 KeyName="" KeyValue="">
<AppElement KeyName="this is key" KeyValue="this is value" KeyValue2="this is value2" />
</section1>
<SectionA KeyName="hahahaha" KeyValue="1234567" />
<SectionB KeyName="this is key name" KeyValue="this is key value">
<ElementCollection>
<add KeyName="e1 key" KeyValue="e1 value" KeyValue2="e1 value2" />
<add KeyName="e2 key" KeyValue="e2 value" KeyValue2="e2 value2" />
<add KeyName="e3 key" KeyValue="e3 value" KeyValue2="e3 value2" />
</ElementCollection>
</SectionB>
</configuration>

一般XML文件的结构分析:
1、整个XML配置文件以<?xml version="1.0" encoding="utf-8"?> 为头部声明指示版本为1.0 字符编码为utf-8
2、有一个根节点<configuration>。所有内容都必须在这个根节点中。
3、有一个自定义区域的声明块<configSections>。所有自定义的区域必须在这个块中声明。
4、有二个预定义的区域<appSettings>及<connectionStrings>。它们是.NET预先定义好的区域,如果没有使用到它们那在文件中就不会出现这二个区域。
5、若干其它自定义区域如上面出现的:<section1> ,<SectionA>, <SectionB>。这些区域的标签名必须和自定义区域声明中声明的section name一致。
6、在每个自定义区域中可以有若干子节点,元素集合,与基本元素。
7、所有自定义的区域,集合,都可以有若干属性,如<SectionA KeyName="hahahaha" KeyValue="1234567" /> 中的KeyName="hahahaha" KeyValue="1234567" 就是二个属性。
8、所有在自定义区域下的元素都可以有若干属性,但必须以add标识开头,并且第一个属性为key值,在同一组元素中的key值不能相同。
9、二个预定义区域下的元素属性是固定的,不可以出现除规定属性外其它的属性。

下面我们根据上面XML的配置内容来使用System.Configuration下面类来进行读写操作。
注意:必须在项目-->引用里 添加一个System.Configuration引用,并在代码文件中using

1、定义各个区域,集合和元素类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;

namespace OracleDataConvertTxt
{
//AppSectionA,AppSectionB:区域节点类,在XML中为一个仅次于根节点的子节点。继承自ConfigurationSection。
//AppElementCollection:元素集合类,在XML中为一个区域节点下的子节点。继承自ConfigurationElementCollection。
//LoadSettingsElement:元素类,在XML中为一个基本元素。继承自ConfigurationElement。
//AppSectionGroup:区域节点集合类,在XML中为一组区域。继承自ConfigurationSectionGroupCollection

public sealed class AppSectionA : ConfigurationSection
{//一个简单的AppSectionA区域 只包含二个属性和一个固定元素
//第一个属性
[ConfigurationProperty("KeyName", IsRequired = true)]
public string KeyName
{
get { return (string)base["KeyName"]; }
set { base["KeyName"] = value; }
}
//第二个属性
[ConfigurationProperty("KeyValue", IsRequired = true)]
public string KeyValue
{
get { return (string)base["KeyValue"]; }
set { base["KeyValue"] = value; }
}
//一个元素
[ConfigurationProperty("AppElement", IsRequired = true)]
public AppElement AppElement
{
get { return (AppElement)base["AppElement"]; }
}
}

public sealed class AppSectionB : ConfigurationSection
{//复杂一点AppSectionB区域,包含二个属性和一个AcountElementCollection元素集合(元素集合的好处是可以动态的添加和删除集合中的元素)
//第一个属性
[ConfigurationProperty("KeyName", IsRequired = true)]
public string KeyName
{
get { return (string)base["KeyName"]; }
set { base["KeyName"] = value; }
}
//第二个属性
[ConfigurationProperty("KeyValue", IsRequired = true)]
public string KeyValue
{
get { return (string)base["KeyValue"]; }
set { base["KeyValue"] = value; }
}
//一个元素
[ConfigurationProperty("ElementCollection", IsRequired = true)]
public AppElementCollection ElementCollection
{
get { return (AppElementCollection)base["ElementCollection"]; }
}
}

public sealed class AppElementCollection : ConfigurationElementCollection
{//定义一个AppElementCollection元素集合类

//其实关键就是这二个索引器,但它也是调用基类的实现,只是做下类型转换就行了
        //这二个索引器一个是字符串版本,一个是数字版本。由于这些成员被基类声明为了protected,所以要公开这些方法给外部使用。而索引器是不能被继承的,所有要NEW
        new public AppElement this[string name]
        {
            get { return (AppElement)base.BaseGet(name); }
            //set 可以不用设置。因为可以通过get返回后,直接修改返回的对象就可以了,它们是引用类型。
            set { AppElement app = ((AppElement)BaseGet(name)); app.KeyName = value.KeyName; app.KeyValue = value.KeyValue; app.KeyValue2 = value.KeyValue2; }
        }
        new public AppElement this[int index]
        {
            get { return (AppElement)base.BaseGet(index); }
            //set 可以不用设置。因为可以通过get返回后,直接修改返回的对象就可以了,它们是引用类型。
            set { AppElement app = ((AppElement)BaseGet(index)); app.KeyName = value.KeyName; app.KeyValue = value.KeyValue; app.KeyValue2 = value.KeyValue2; }
        }

//下面二个方法中抽象类中必须要实现的
protected override ConfigurationElement CreateNewElement()
{
return new AppElement();
}

protected override object GetElementKey(ConfigurationElement element)
{
return ((AppElement)element).KeyName;
}

//说明:如果不需要在代码中修改集合,可以不实现Add,Clear,Remove
public void Add(AppElement setting)
{
this.BaseAdd(setting);
}

public void Clear()
{
this.BaseClear();
}

public ConfigurationElement Get(string keyName)
{
return this.BaseGet(keyName);
}

public void Remove(string keyName)
{
this.BaseRemove(keyName);
}
}

public sealed class AppElement : ConfigurationElement
{
//这是定义基本的元素类,它有三个属性,默认第一属性为它的Key,Key的值不能重复
[ConfigurationProperty("KeyName", IsRequired = true)]
public string KeyName
{
get { return this["KeyName"].ToString(); }
set { base["KeyName"] = value; }
}

[ConfigurationProperty("KeyValue", IsRequired = false)]
public string KeyValue
{
get { return this["KeyValue"].ToString(); }
set { this["KeyValue"] = value; }
}

[ConfigurationProperty("KeyValue2", IsRequired = false)]
public string KeyValue2
{
get { return this["KeyValue2"].ToString(); }
set { this["KeyValue2"] = value; }
}
}

}

2、在程序中进行操作:
private void button1_Click(object sender, EventArgs e)
{
//得到一个配置对象
Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//--------------.NET提供的二个预定义区域 AppSettings 及 ConnectionStrings -----------

//使用预定义的AppSettings区域配置节点,在里面添加元素,元素必须是一个KeyValueConfigurationElement类的对象。
//这个对象是一个键、值对。
KeyValueConfigurationElement Element = new KeyValueConfigurationElement("huangbo", "1234567890");
cfg.AppSettings.Settings.Add(Element); //也可以直接写成 cfg.AppSettings.Settings.Add("huangbo", "1234567890");

//使用预定义的ConnectionStrings区域配置节点,在里面添加元素,元素必须是一个ConnectionStringSettings类的对象
ConnectionStringSettings constrSetting = new ConnectionStringSettings("连接的名称,就类同于Key", "具体的连接字符串", "与连接字符串一起使用的提供程序的名称。这个有时可以没有");
cfg.ConnectionStrings.ConnectionStrings.Add(constrSetting);

//-------------以下是自定义区域------------

//声明一个区域section1并把它加入到cfg中。
AppSectionA section1 = new AppSectionA();
section1.AppElement.KeyName = "this is key";
section1.AppElement.KeyValue = "this is value";
section1.AppElement.KeyValue2 = "this is value2";
cfg.Sections.Add("section1", section1);

//声明一个区域sectionA并把它加入到cfg中。
AppSectionB sectionA = new AppSectionB();
sectionA.KeyName = "hahahaha";
sectionA.KeyValue = "1234567";
cfg.Sections.Add("SectionA", sectionA);

//声明一个区域sectionB并把它加入到cfg中。
AppSectionB sectionB = new AppSectionB();
sectionB.KeyName = "this is key name";
sectionB.KeyValue = "this is key value";
AppElement e1 = new AppElement();
AppElement e2 = new AppElement();
AppElement e3 = new AppElement();
e1.KeyName = "e1 key";
e1.KeyValue = "e1 value";
e1.KeyValue2 = "e1 value2";
e2.KeyName = "e2 key";
e2.KeyValue = "e2 value";
e2.KeyValue2 = "e2 value2";
e3.KeyName = "e3 key";
e3.KeyValue = "e3 value";
e3.KeyValue2 = "e3 value2";
sectionB.ElementCollection.Add(e1);
sectionB.ElementCollection.Add(e2);
sectionB.ElementCollection.Add(e3);
cfg.Sections.Add("SectionB", sectionB);

//删除一个元素 删除sectionB下面ElementCollection元素集合里的第一个Key值叫 e1 key 的元素。(Key值就是元素的第一个属性值)
//必须是ElementCollection下的元素才允许被删除,因为ElementCollection是一个集合,集合里的项是可以被删除的。而直接在区域下的元素无法删除,因为它被定义成类的属性了。
//sectionB.ElementCollection.Remove("e1 key");

//删除一个区域SectionA
//cfg.Sections.Remove("SectionA");

//更新一个元素
//sectionB.ElementCollection["e2 key"].KeyValue = "e2 new value";

//将Configuration对象cfg的配置 写入到当前XML文件中去
cfg.Save();

//刷新命名节点,这样在下次检索它时将重新从磁盘读取它。
ConfigurationManager.RefreshSection("sectionB");

//直接给赋值
//AppElement tmpelement = new AppElement();
//tmpelement.KeyName = "bob";
//tmpelement.KeyValue = "bobvalue";
//tmpelement.KeyValue2 = "bobvalue2";
//AppSectionB appsection2 = cfg.GetSection("SectionB") as AppSectionB;
//appsection2.ElementCollection["e3 key"] = tmpelement;
//cfg.Save();

}

Config程序配置文件(configSections)操作实践及代码详注的更多相关文章

  1. Config程序配置文件操作实践进阶之ConfigurationSectionGroup

    今天又进一步对System.Configuration下的ConfigurationSectionGroup类及相关的类与方法进行了研究.发现要构建多层次嵌套的XML标签 则必须用到Configura ...

  2. C#----操作应用程序配置文件App.config

    对配置文件的一些疑问: 在应用程序的目录下,有两处值得注意的地方,一个是应用程序根目录下的App.config文件,和bin\debug\name.exe.config 或者 bin\Release\ ...

  3. C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作

    原文 http://www.cnblogs.com/codealone/archive/2013/09/22/3332607.html 应用程序配置文件,对于asp.net是 web.config,对 ...

  4. C#/ASP.NET应用程序配置文件app.config/web.config的增、删、改操作,无法为请求的 Configuration 对象创建配置文件。

    应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本 ...

  5. C#应用程序配置文件.config介绍

    我们经常会希望在程序中写入一些配置信息,例如版本号,以及数据库的连接字符串等.你可能知道在WinForm应用程序中可以利用Properties.Settings来进行类似的工作,但这些其实都利用了Ap ...

  6. C# 应用程序配置文件操作

    应用程序配置文件,对于asp.net是 web.config对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本质 ...

  7. C# 应用程序配置文件App.Config和web.config

    应用程序配置文件,对于asp.net是 web.config,对于WINFORM程序是 App.Config(ExeName.exe.config). 配置文件,对于程序本身来说,就是基础和依据,其本 ...

  8. .NET 多个程序配置文件合并到主app.config

    .NET 多个程序配置文件合并到主app.config

  9. .NET下对Web.config与App.Config的增删改操作的代码

    把代码过程常用的内容做个收藏,下边代码段是关于 .NET下对Web.config与App.Config的增删改操作的代码. <?xml version="1.0" encod ...

随机推荐

  1. 【2018ACM/ICPC网络赛】沈阳赛区

    这次网络赛没有打.生病了去医院了..尴尬.晚上回来才看了题补简单题. K  Supreme Number 题目链接:https://nanti.jisuanke.com/t/31452 题意:输入一个 ...

  2. 【学术篇】NOIP2017 d2t3 列队phalanx splay做法

    我可去他的吧.... ==============先胡扯些什么的分割线================== 一道NOIP题我调了一晚上...(其实是因为昨晚没有找到调试的好方法来的说...) 曾经我以 ...

  3. 时间 '2018-08-06T10:00:00.000Z' 格式转化为本地时间(转)

    原文:https://blog.csdn.net/sxf_123456/article/details/81582964 from datetime import datetime,timedelta ...

  4. 校园商铺-2项目设计和框架搭建-9验证Service

    1. 新建接口 main: com.csj2018.o2o.service/AreaService.java package com.csj2018.o2o.service; import java. ...

  5. SQL Server 添加数据库没有权限等

    { 在安装好sql 后 第一次需要用windows 方式登陆 1.创建一个宁外一个登陆名登陆 在安全->登陆名 2.给此登陆属性的服务器角色添加sysadmin权限 //尽情享受!!! }

  6. thinkphp 范围标签

    范围判断标签包括in notin between notbetween四个标签,都用于判断变量是否中某个范围. 大理石平台价格 IN和NOTIN 用法: 假设我们中控制器中给id赋值为1: $id = ...

  7. go网络库cellent实现socket聊天功能

    一 .介绍 cellnet是一个组件化.高扩展性.高性能的开源服务器网络库 git地址:https://github.com/davyxu/cellnet 主要使用领域: 游戏服务器 方便定制私有协议 ...

  8. php算法题---连续子数组的最大和

    php算法题---连续子数组的最大和 一.总结 一句话总结: 重要:一定要本机调试过了再提交代码,因为很容易出现考虑不周的情况,或者修改了之后没有考虑修改的这部分 利用空间来换时间,或者利用空间来换算 ...

  9. 用pymysql实现的注册登录公告练习

    import pymysql #1.连接服务器 conn=pymysql.connect( host='127.0.0.1', port=3306, user='root', password='12 ...

  10. Hibernate数据保存操作方法的原理对比

    Interface Session All Superinterfaces: Serializable All Known Subinterfaces: EventSource, Session Al ...