配置文件读写
System.ConfigurationManager類(lèi)用于對(duì)配置文件的讀取。其具有的成員如下:
一、AppSettings
? AppSetting是最簡(jiǎn)單的配置節(jié),讀寫(xiě)非常簡(jiǎn)單。
| 名稱 | 說(shuō)明 |
| AppSettings | 獲取當(dāng)前應(yīng)用程序默認(rèn)配置的 AppSettingsSection 數(shù)據(jù) |
| ConnectionStrings | 獲取當(dāng)前應(yīng)用程序默認(rèn)配置的 ConnectionStringsSection 數(shù)據(jù) |
?
<?xml version="1.0" encoding="utf-8" ?> <configuration><appSettings><add key="DB" value="Access" /></appSettings><connectionStrings><add name="connstr" connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=F:\C#Code\DBOperation\ykjj.mdb"/></connectionStrings> </configuration>示例:
class Program{static void Main(string[] args){string strAppSettings = System.Configuration.ConfigurationManager.AppSettings["DB"]; //通過(guò)屬性索引獲取值Console.WriteLine(strAppSettings);string strConnection = System.Configuration.ConfigurationManager.ConnectionStrings["connstr"].ToString();Console.WriteLine(strConnection);Console.ReadKey();}}
對(duì)于以上這一個(gè)appSettings與connectionStrings都是由ConfigurationManager提供的兩個(gè)屬性來(lái)讀取的。通常大多數(shù)的配置信息都可以放在appSettings里。但是如果你覺(jué)得不夠用了,你還可以使用自定義配置信息。
二、自定義配置節(jié)
1、自帶Handler
關(guān)于自定義配置節(jié),Configuration提供了很多Handler類(lèi)來(lái)供你選擇使用。甚至如果你覺(jué)得不夠,還可以自定義處理Handler。
先來(lái)學(xué)下使用怎么使用三個(gè)簡(jiǎn)單的Handler:
- System.Configuration.NameValueSectionHandler
- System.Configuration.DictionarySectionHandler
- System.Configuration.SingleTagSectionHandler
配置文件代碼示例:
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="Person" type="System.Configuration.NameValueSectionHandler"/> <!--以NameValue鍵值/對(duì)的形式返回配置節(jié)中的信息--><section name="Man" type="System.Configuration.DictionarySectionHandler"/> <!--以Dictionary字典鍵值對(duì)的形式返回配置節(jié)中的信息--><section name="Name" type="System.Configuration.SingleTagSectionHandler" /> <!--基礎(chǔ)結(jié)構(gòu)。處理 .config 文件中由單個(gè) XML 標(biāo)記所表示的各配置節(jié)。--></configSections><Person><add key="老大" value="劉備" /><add key="老二" value="關(guān)羽" /><add key="老三" value="張飛" /></Person><Man><add key="老大" value="曹操" /><add key="老二" value="典韋" /><add key="老三" value="郭嘉" /></Man><Name one="1" two="2" three="3" four="4" five="5" /> <!--注意是要單個(gè)節(jié)SingleTagSectionHandler才能處理,但是無(wú)論你索性有多少個(gè)也能處理--> </configuration>讀取代碼示例:
static void Main(string[] args) {//讀取人名NameValueCollection nvc = (NameValueCollection)ConfigurationManager.GetSection("Person");foreach (string key in nvc.AllKeys){Console.WriteLine(key + ":" + nvc[key]);}//讀取男人IDictionary dict = (IDictionary)ConfigurationManager.GetSection("Man");foreach (string key in dict.Keys){Console.WriteLine(key + ":" + dict[key]);}IDictionary dict1 = (IDictionary)ConfigurationManager.GetSection("Name");foreach (string key in dict1.Keys){Console.WriteLine(key + ":" + dict1[key]);}Console.ReadKey(); }輸出結(jié)果如下:
2、自定義Handler
自定義讀取節(jié)點(diǎn)需要實(shí)現(xiàn)接口IConfigurationSectionHandler,并提供Create的具體實(shí)現(xiàn)。
Appconfig代碼:
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections> <!--后面的type是處理處理節(jié)點(diǎn)PersonHandler所在的位置第二個(gè)參數(shù)是程序集,你可以不要Version開(kāi)始之后的--><section name="Person" type="ConsoleApplication1.PersonHandler,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /></configSections><Person age="23" name="劉備" /> </configuration>主程序代碼:
class Program{static void Main(string[] args){Hashtable config = ConfigurationManager.GetSection("Person") as Hashtable;Console.WriteLine("節(jié)點(diǎn)數(shù)量是:" + config.Count);//2重鍵值對(duì)的方式,其中deKey又可以再次轉(zhuǎn)化為一個(gè)Hashtableforeach (DictionaryEntry deKey in config){Console.WriteLine("屬性元素: " + deKey.Key.ToString());Hashtable attribs = (Hashtable)deKey.Value;foreach (DictionaryEntry deAttrib in attribs){Console.WriteLine(deAttrib.Key.ToString() + "=" + deAttrib.Value.ToString());}}Console.ReadKey();}}//注意必須要實(shí)現(xiàn)IConfigurationSectionHandler接口class PersonHandler : IConfigurationSectionHandler{public object Create(object parent, object configContext, System.Xml.XmlNode section){Hashtable myConfig = new Hashtable();// 本節(jié)元素,獲取的任何屬性。Hashtable myAttribs = new Hashtable();//遍歷當(dāng)前節(jié)點(diǎn)的屬性foreach (XmlAttribute attrib in section.Attributes){//如果當(dāng)前節(jié)點(diǎn)是屬性節(jié)點(diǎn),則添加進(jìn)入myAttribsif (XmlNodeType.Attribute == attrib.NodeType){myAttribs.Add(attrib.Name, attrib.Value);}}//把當(dāng)前屬性節(jié)點(diǎn)集合添加進(jìn)myConfigmyConfig.Add(section.Name, myAttribs);return myConfig;}}輸出結(jié)果如下:
? 這樣的配置代碼看起來(lái)還是有點(diǎn)吃力,畢竟Hashtable的層次有兩層。
3、property屬性的方式讀取
先來(lái)看看配置文件的寫(xiě)法:
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections> <!--后面的type是處理處理節(jié)點(diǎn)PersonSection所在的位置第二個(gè)參數(shù)是程序集,你可以不要Version開(kāi)始之后的--><section name="Person" type="ConsoleApplication1.PersonSection,ConsoleApplication1,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" /></configSections><Person age="23" name="劉備" /> </configuration>然后程序代碼:
class Program{static void Main(string[] args){PersonSection person = ConfigurationManager.GetSection("Person") as PersonSection;Console.WriteLine("name={0},age={1}", person.Age, person.Name);Console.ReadKey();}}//注意 這里是繼承自System.Configuration.ConfigurationSection了class PersonSection : System.Configuration.ConfigurationSection{[ConfigurationProperty("age", IsRequired = false, DefaultValue = 0)]public int Age{get { return (int)base["age"]; } set { base["age"] = value; }}[ConfigurationProperty("name", IsRequired = false, DefaultValue = "")]public string Name{get { return (string)base["name"]; }set { base["name"] = value; }}}輸出結(jié)果如下:
4、配置子元素
對(duì)于稍微在復(fù)雜一點(diǎn)的結(jié)構(gòu),子元素的Model類(lèi)要繼承自ConfigurationElement。
config文件代碼:
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="complex" type="ConsoleApplication1.ComplexSection,ConsoleApplication1"/></configSections><complex height="182"><child firstName="張" lastName="飛"/></complex> </configuration>主程序代碼:
class Program{static void Main(string[] args){ComplexSection sec = ConfigurationManager.GetSection("complex") as ComplexSection;Console.WriteLine(sec.Height); //訪問(wèn)屬性Console.WriteLine(sec.Child.FirstName); //訪問(wèn)子節(jié)點(diǎn)屬性Console.WriteLine(sec.Child.LastName); //訪問(wèn)子節(jié)點(diǎn)屬性Console.ReadKey();}}public class ComplexSection : ConfigurationSection{[ConfigurationProperty("height", IsRequired = true)]public int Height{get { return (int)base["height"]; }set { base["height"] = value; }}[ConfigurationProperty("child", IsDefaultCollection = false)]public ChildSection Child{get { return (ChildSection)base["child"]; }set { base["child"] = value; }}}public class ChildSection : ConfigurationElement{[ConfigurationProperty("firstName", IsRequired = true, IsKey = true)]public string FirstName{get { return (string)base["firstName"]; }set { base["firstName"] = value; }}[ConfigurationProperty("lastName", IsRequired = true)]public string LastName{get { return (string)base["lastName"]; }set { base["lastName"] = value; }}}輸出結(jié)果如圖所示:
5、配置文件中的CDATA
有時(shí)候,在配置文件里可能會(huì)包含一些比較復(fù)雜的代碼段,這時(shí)候就要用到XML的CDATA了。
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="MySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /></configSections><MySection><HTML><![CDATA[<div style="# font-size:24px">加粗顯示</div>]]></HTML><SQL><![CDATA[SELECT TOP 10 * FROM Person]]></SQL></MySection> </configuration>主程序代碼如下:
namespace ConsoleApplication1 {class Program{static void Main(string[] args){MySection section = ConfigurationManager.GetSection("MySection") as MySection;Console.WriteLine("{0}{1}", section.HTML.CommandText, section.SQL.CommandText);Console.ReadKey();}}//注意 這里是繼承自System.Configuration.ConfigurationSection了class MySection : System.Configuration.ConfigurationSection{[ConfigurationProperty("HTML", IsRequired = false)]public MyTextElement HTML{get { return (MyTextElement)base["HTML"]; }set { base["HTML"] = value; }}[ConfigurationProperty("SQL", IsRequired = false)]public MyTextElement SQL{get { return (MyTextElement)base["SQL"]; }set { base["SQL"] = value; }}}public class MyTextElement : ConfigurationElement{protected override void DeserializeElement(System.Xml.XmlReader reader, bool serializeCollectionKey){CommandText = reader.ReadElementContentAs(typeof(string), null) as string;}protected override bool SerializeElement(System.Xml.XmlWriter writer, bool serializeCollectionKey){if (writer != null){writer.WriteCData(CommandText);}return true;}[ConfigurationProperty("data", IsRequired = false)]public string CommandText{get { return this["data"].ToString(); }set { this["data"] = value; }}} }輸出如下:
6、配置元素Collection
類(lèi)似下面的配置方式,在ASP.NET的HttpHandler, HttpModule中太常見(jiàn)了。?
<?xml version="1.0" encoding="utf-8" ?> <configuration><configSections><section name="MySection" type="ConsoleApplication1.MySection, ConsoleApplication1" /></configSections><MySection><add key="a" value="劉備"></add><add key="b" value="關(guān)羽"></add><add key="c" value="張飛"></add></MySection> </configuration>實(shí)現(xiàn)代碼如下:
class Program{static void Main(string[] args){MySection section = ConfigurationManager.GetSection("MySection") as MySection;foreach (MyKeyValueSetting add in section.KeyValues){Console.WriteLine(add.Key + ":" + add.Value);}Console.ReadKey();}}public class MySection : ConfigurationSection // 所有配置節(jié)點(diǎn)都要選擇這個(gè)基類(lèi){private static readonly ConfigurationProperty s_property = new ConfigurationProperty(string.Empty, typeof(MyKeyValueCollection), null, ConfigurationPropertyOptions.IsDefaultCollection);[ConfigurationProperty("", Options = ConfigurationPropertyOptions.IsDefaultCollection)]public MyKeyValueCollection KeyValues{get{return (MyKeyValueCollection)base[s_property];}}}[ConfigurationCollection(typeof(MyKeyValueSetting))]public class MyKeyValueCollection : ConfigurationElementCollection // 自定義一個(gè)集合{// 基本上,所有的方法都只要簡(jiǎn)單地調(diào)用基類(lèi)的實(shí)現(xiàn)就可以了。public MyKeyValueCollection() : base(StringComparer.OrdinalIgnoreCase) // 忽略大小寫(xiě){}// 其實(shí)關(guān)鍵就是這個(gè)索引器。但它也是調(diào)用基類(lèi)的實(shí)現(xiàn),只是做下類(lèi)型轉(zhuǎn)就行了。new public MyKeyValueSetting this[string name]{get { return (MyKeyValueSetting)base.BaseGet(name); }}// 下面二個(gè)方法中抽象類(lèi)中必須要實(shí)現(xiàn)的。protected override ConfigurationElement CreateNewElement(){return new MyKeyValueSetting();}protected override object GetElementKey(ConfigurationElement element){return ((MyKeyValueSetting)element).Key;}// 說(shuō)明:如果不需要在代碼中修改集合,可以不實(shí)現(xiàn)Add, Clear, Removepublic void Add(MyKeyValueSetting setting){this.BaseAdd(setting);}public void Clear(){base.BaseClear();}public void Remove(string name){base.BaseRemove(name);}}public class MyKeyValueSetting : ConfigurationElement // 集合中的每個(gè)元素{[ConfigurationProperty("key", IsRequired = true)]public string Key{get { return this["key"].ToString(); }set { this["key"] = value; }}[ConfigurationProperty("value", IsRequired = true)]public string Value{get { return this["value"].ToString(); }set { this["value"] = value; }}}輸出如下:
小結(jié):
1. 為每個(gè)集合中的參數(shù)項(xiàng)創(chuàng)建一個(gè)從ConfigurationElement繼承的派生類(lèi)。
2. 為集合創(chuàng)建一個(gè)從ConfigurationElementCollection繼承的集合類(lèi),具體在實(shí)現(xiàn)時(shí)主要就是調(diào)用基類(lèi)的方法。
3. 在創(chuàng)建ConfigurationSection的繼承類(lèi)時(shí),創(chuàng)建一個(gè)表示集合的屬性就可以了,注意[ConfigurationProperty]的各參數(shù)。
7、配置節(jié)點(diǎn)的寫(xiě)入
寫(xiě)入配置節(jié)點(diǎn)的示例如下:
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);PersonSection Section = config.GetSection("Person") as PersonSection;Section.Name = "撼地神牛";Section.Age = 10000;config.Save();ConfigurationManager.RefreshSection("Person"); //讓修改之后的結(jié)果生效在修改配置節(jié)點(diǎn)前,我們需要調(diào)用ConfigurationManager.OpenExeConfiguration(),然后調(diào)用config.GetSection()在得到節(jié)點(diǎn)后,轉(zhuǎn)成我們定義的節(jié)點(diǎn)類(lèi)型, 然后就可以按照強(qiáng)類(lèi)型的方式來(lái)修改我們定義的各參數(shù)項(xiàng),最后調(diào)用config.Save();即可。
注意:
8、讀取.Net Framework中已經(jīng)定義的節(jié)點(diǎn)
.Net Framework已定義節(jié)點(diǎn)的讀取很簡(jiǎn)單:
<system.web><httpModules><add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/><add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/></httpModules></system.web>主程序如下:
public ActionResult Index(){HttpModulesSection section = ConfigurationManager.GetSection("system.web/httpModules") as HttpModulesSection;foreach (HttpModuleAction action in section.Modules){Response.Write(action.Name + "<br/>");}return Content("");}輸出如下:
注意,連服務(wù)器上mechine里面的配置都會(huì)一起讀出來(lái)。
在Web.config里是只讀的,寫(xiě)不了,而非Web程序的寫(xiě)與上面的例子一樣,此處不再?gòu)?fù)述。
轉(zhuǎn)載于:https://www.cnblogs.com/taomylife/p/5461013.html
總結(jié)
- 上一篇: Unreal Engine 4 —— 冷
- 下一篇: 关于MySql中自增长id设置初始值