配置文件操作
??? 配置文件一般分為內置配置文和用戶自定義配置文件。
??? 內置配置文件包括app.config、web.config、Settings.settings等等。
用戶自定義配置文件一般是將配置信息放到XML文件或注冊表中,配置信息一般包括程序設置,記錄運行信息,保存控件的信息(比如位置,樣式)。
一、內置配置文件操作
app.config和web.config操作類似,以app.config為例,Settings.settings能夠指定值的類型和范圍。
1.app.config文件操作
該配置文件中主要的節點有:connectionStrings、appSettings、configSections等,這幾個屬于常用,操作都略有不同,DotNet提供直接操作各個節點的方法。在用到ConfigurationManager時要添加system.configuration.dll程序集的引用。
程序移植后配置文件的修改會保存在.exe.config的文件中,但是根據我經驗如果你不修改配置文件,一般exe不自動創建一個.exe.config的文件。
在項目進行編譯后,在bin\Debuge文件下,將出現兩個配置文件,一個名為“*.EXE.config”,另一個名為“*.vshost.exe.config”。第一個文件為項目實際使用的配置文件,在程序運行中所做的更改都將被保存于此;第二個文件為原代碼“app.config”的同步文件,在程序運行中不會發生更改。
?
l? connectionStrings:由于保存數據連接字符串。
讀:
[csharp] view plaincopy print?
ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;?? ConfigurationManager.ConnectionStrings["AccessDB"].ConnectionString;
寫:
[csharp] view plaincopy print?
????ConnectionStringSettings?setConnStr?=?newConnectionStringSettings("AccessDB",?connectionString,"System.Data.OleDb");????????Configuration?appConfig?=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);????????appConfig.ConnectionStrings.ConnectionStrings.Add(setConnStr);????appConfig.Save();????????ConfigurationManager.RefreshSection("connectionStrings");?? //設置連接字符串ConnectionStringSettings setConnStr = newConnectionStringSettings("AccessDB", connectionString,"System.Data.OleDb");//打開當前應用程序的app.config文件,進行操作Configuration appConfig =ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);//由于沒有更新連接字符串的方法,所以這里直接再添加一個連接字符串appConfig.ConnectionStrings.ConnectionStrings.Add(setConnStr);appConfig.Save();// 強制重新載入配置文件的ConnectionStrings配置節ConfigurationManager.RefreshSection("connectionStrings");
l? appSettings:主要存儲程序設置,以鍵值對的形式出現。
讀:
[csharp] view plaincopy print?
String?str?=?ConfigurationManager.AppSettings["DemoKey"];?? String str = ConfigurationManager.AppSettings["DemoKey"];
寫:
[csharp] view plaincopy print?
Configuration?cfg=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);????cfg.AppSettings.Settings["DemoKey"].Value=?"DemoValue";????cfg.Save();?? Configuration cfg=ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);cfg.AppSettings.Settings["DemoKey"].Value= "DemoValue";cfg.Save();
l? configSections:自定義配置節
name:自定義配置節的名稱。
type:自定義配置節的類型,主要包括:
System.Configuration.SingleTagSectionHandler
System.Configuration.DictionarySectionHandler
System.Configuration.NameValueSectionHandler。
不同的type不但設置配置節的方式不一樣,最后訪問配置文件的操作上也有差異。
三個不同的type操作:
[html] view plaincopy print?
<?xmlversionxmlversion="1.0"?encoding="utf-8"??>????<configuration>?????????<configSections>?????????????<sectiontypesectiontype="System.Configuration.SingleTagSectionHandler"/>?????????????<sectiontypesectiontype="System.Configuration.DictionarySectionHandler"/>?????????????<sectiontypesectiontype="System.Configuration.NameValueSectionHandler"?/>?????????</configSections>?????????<Test1?setting1="Hello"setting2="World"/>?????????<Test2>?????????????<add?key="Hello"value="World"?/>?????????</Test2>?????????<Test3>?????????????<add?key="Hello"value="World"?/>?????????</Test3>???????</configuration>?? <?xmlversion="1.0" encoding="utf-8" ?><configuration><configSections><sectiontype="System.Configuration.SingleTagSectionHandler"/><sectiontype="System.Configuration.DictionarySectionHandler"/><sectiontype="System.Configuration.NameValueSectionHandler" /></configSections><Test1 setting1="Hello"setting2="World"/><Test2><add key="Hello"value="World" /></Test2><Test3><add key="Hello"value="World" /></Test3> </configuration>
?
說明:在聲明部分使用<sectiontype="System.Configuration.SingleTagSectionHandler"/>聲明了一個配置節它的名字叫Test1,類型為SingleTagSectionHandler。在設置配置節部分使用 <Test1 setting1="Hello"setting2="World"/>設置了一個配置節,它的第一個設置的值是Hello,第二個值是World,當然還可以有更多。其它的兩個配置節和這個類似。?
下面我們看在程序中如何訪問這些自定義的配置節。我們用過ConfigurationSettings類的靜態方法GetConfig來獲取自定義配置節的信息。
[csharp] view plaincopy print?
????IDictionary?IDTest1?=(IDictionary)ConfigurationSettings.GetConfig("Test1");????string?str?=?(string)IDTest1["setting1"]+"?"+(string)IDTest1["setting2"];????MessageBox.Show(str);????????????????string[]?values1=new?string[IDTest1.Count];????IDTest1.Values.CopyTo(values1,0);????MessageBox.Show(values1[0]+""+values1[1]);?????????????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]);????????NameValueCollectionnc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");????MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]);??? //訪問配置節Test1IDictionary IDTest1 =(IDictionary)ConfigurationSettings.GetConfig("Test1");string str = (string)IDTest1["setting1"]+" "+(string)IDTest1["setting2"];MessageBox.Show(str); //輸出Hello World//訪問配置節Test1的方法2string[] values1=new string[IDTest1.Count];IDTest1.Values.CopyTo(values1,0);MessageBox.Show(values1[0]+""+values1[1]); //輸出HelloWorld//訪問配置節Test2IDictionary 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]);//訪問配置節Test3NameValueCollectionnc=(NameValueCollection)ConfigurationSettings.GetConfig("Test3");MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]); //輸出HelloWorld
配置節處理程序
返回類型
SingleTagSectionHandler
Systems.Collections.IDictionary
DictionarySectionHandler
Systems.Collections.IDictionary
NameValueSectionHandler
Systems.Collections.Specialized.NameValueCollection
?
l? sectionGroup:自定義配置節組
配置節組是使用<sectionGroup>元素,將類似的配置節分到同一個組中。配置節組聲明部分將創建配置節的
包含元素,在<configSections>元素中聲明配置節組,并將屬于該組的節置于<sectionGroup>元素中。下面
是一個包含配置節組的配置文件的例子:
[html] view plaincopy print?
<?xml?version="1.0"encoding="utf-8"??>????<configuration>?????????<configSections>????????????<sectionGroup?>????????????????<section?type="System.Configuration.NameValueSectionHandler"/>????????????</sectionGroup>?????????</configSections>???????????????<TestGroup>????????????<Test>????????????????<add?key="Hello"?value="World"/>????????????</Test>?????????</TestGroup>????</configuration>?? <?xml version="1.0"encoding="utf-8" ?><configuration><configSections><sectionGroup ><section type="System.Configuration.NameValueSectionHandler"/></sectionGroup></configSections><TestGroup><Test><add key="Hello" value="World"/></Test></TestGroup></configuration>
下面是訪問這個配置節組的代碼:
NameValueCollectionnc=(NameValueCollection)ConfigurationSettings.GetConfig("TestGroup/Test");
MessageBox.Show(nc.AllKeys[0].ToString()+""+nc["Hello"]);????//輸出HelloWorld
?
2.Settings.settings配置文件操作
?這個用的不多,操作也很簡單,在此不詳細敘述。
?
二、用戶自定義文件操作
1.XML配置文件操作
XML配置文件一般由我們自己定義格式,由于某些地方對于app.config不提供寫的功能,我們就需要自己來操作這個XML,這里我們就拿它作為例子,來說明XML的操作。
privatevoid SaveConfig(string ConnenctionString)
???????? {
???????????? XmlDocument doc=new XmlDocument();
???????????? //獲得配置文件的全路徑
???????????? stringstrFileName=AppDomain.CurrentDomain.BaseDirectory.ToString()+"Code.exe.config";
???????????? doc.LOAd(strFileName);
???????????? //找出名稱為“add”的所有元素
????????????XmlNodeList nodes=doc.GetElementsByTagName("add");
???????????? for(int i=0;i<nodes.Count;i++)
???????????? {
????? ???????????//獲得將當前元素的key屬性
???????????????? XmlAttributeatt=nodes[i].Attributes["key"];
???????????????? //根據元素的第一個屬性來判斷當前的元素是不是目標元素
???????????????? if (att.Value=="ConnectionString")
???????????????? {
???????????????????? //對目標元素中的第二個屬性賦值
????????????????????att=nodes[i].Attributes["value"];
????????????????????att.Value=ConnenctionString;
???????????????????? break;
???????????????? }
???????????? }
???????????? //保存上面的修改
????????????doc.Save(strFileName);
???????? }
?
2.注冊表配置操作
首先注冊表也是以鍵值對的形式存儲的,DotNet提供對注冊表的操作。
操作實例:
??????
[csharp] view plaincopy print?
??<span?style="font-size:12px;">?????????public?static?voidLoadFormPosition(System.Windows.Forms.Form?Fo)???{???????Microsoft.Win32.RegistryKey?rk?=Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\\\MapWinGISConfig",false);???????try???????{???????????if?((rk.GetValue(Fo.Name?+"_x").ToString()?!=?"")?&&?(rk.GetValue(Fo.Name?+"_y").ToString()!=?"")?&&?(rk.GetValue(Fo.Name?+?"_w").ToString()!=?"")?&&?(rk.GetValue(Fo.Name+?"_h").ToString()?!=?""))???????????{???????????????Fo.Location?=?newSystem.Drawing.Point(int.Parse(rk.GetValue(Fo.Name?+"_x").ToString(),CultureInfo.InvariantCulture),?int.Parse(rk.GetValue(Fo.Name?+"_y").ToString(),CultureInfo.InvariantCulture));?????????????????Fo.Size?=?newSystem.Drawing.Size(int.Parse(rk.GetValue(Fo.Name?+"_w").ToString(),CultureInfo.InvariantCulture),?int.Parse(rk.GetValue(Fo.Name?+"_h").ToString(),CultureInfo.InvariantCulture));???????????}???????}???????catch???????{???????}???????finally???????{???????????rk.Close();???????}???}???????????public?static?voidSaveFormPosition(System.Windows.Forms.Form?Fo)???{???????Microsoft.Win32.RegistryKey?rk?=Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\\\MapWinGISConfig");?????????if?(Fo.Visible?&&Fo.WindowState?!=?System.Windows.Forms.FormWindowState.Minimized&&Fo.Location.X?>?-1?&&?Fo.Location.Y?>?-1?&&?Fo.Size.Width>?1?&&?Fo.Size.Height?>?1)???????{???????????rk.SetValue(Fo.Name?+"_x",?Fo.Location.X);???????????rk.SetValue(Fo.Name?+"_y",?Fo.Location.Y);???????????rk.SetValue(Fo.Name?+"_w",?Fo.Size.Width);???????????rk.SetValue(Fo.Name?+"_h",?Fo.Size.Height);???????}???????rk.Close();???}</span>?? <span style="font-size:12px;">/// <summary>/// 從注冊表中加載窗體位置大小等信息/// </summary>public static voidLoadFormPosition(System.Windows.Forms.Form Fo){Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\\\\MapWinGISConfig",false);try{if ((rk.GetValue(Fo.Name +"_x").ToString() != "") && (rk.GetValue(Fo.Name +"_y").ToString()!= "") && (rk.GetValue(Fo.Name + "_w").ToString()!= "") && (rk.GetValue(Fo.Name+ "_h").ToString() != "")){Fo.Location = newSystem.Drawing.Point(int.Parse(rk.GetValue(Fo.Name +"_x").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_y").ToString(),CultureInfo.InvariantCulture));Fo.Size = newSystem.Drawing.Size(int.Parse(rk.GetValue(Fo.Name +"_w").ToString(),CultureInfo.InvariantCulture), int.Parse(rk.GetValue(Fo.Name +"_h").ToString(),CultureInfo.InvariantCulture));}}catch{}finally{rk.Close();}}/// <summary>/// 將窗體位置大小信息保存在注冊表中/// </summary>public static voidSaveFormPosition(System.Windows.Forms.Form Fo){Microsoft.Win32.RegistryKey rk =Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\\\\MapWinGISConfig");if (Fo.Visible &&Fo.WindowState != System.Windows.Forms.FormWindowState.Minimized&&Fo.Location.X > -1 && Fo.Location.Y > -1 && Fo.Size.Width> 1 && Fo.Size.Height > 1){rk.SetValue(Fo.Name +"_x", Fo.Location.X);rk.SetValue(Fo.Name +"_y", Fo.Location.Y);rk.SetValue(Fo.Name +"_w", Fo.Size.Width);rk.SetValue(Fo.Name +"_h", Fo.Size.Height);}rk.Close();}</span>
三、應用程序信息配置
通過代碼繼承ApplicationSettingsBase類(C/S模式),在代碼中設置相關的屬性。
?? 1.繼承該類一般有類屬性[SettingsProvider("System.Configuration.LocalFileSettingsProvider")]-詳情如下
?? 2.每個屬性必須設置是[ApplicationScopedSetting()]還是[UserSocpedSetting()],還可以設置默認值[DefaultSettingValueAttribute("100,100")]
?? 3.屬性設置完成后,在方法級別或方法內部(視情況而定)實例化該繼承的類,在窗體加載時設置相應屬性。加載程序配置方法有兩種-詳情如下。
?? 4.如果需要可以利用事件監視設置的屬性改變、保存、加載時進行哪些操作
?? 5.在窗體注銷時保存設置。
詳解:
?(一),LocalFileSettingsProvider---為應用程序設置類提供持久性存儲。
???? 1.該類提供一種機制--程序使用配置數據的機制,其將程序的設置文件保存到默認的位置。
???? 2.客戶端并不顯示訪問這個類,而是在需要服務時由設置機制自動調用,如:ApplicationSettingsBase中的很多成員都使用該類。
???? 3.該類將配置文件保存為.config的XML文件
???????? 1.若字段的屬性設置為[UserScopedSetting()],則保存為user.config文件,
?????????? 保存位置C:\Documentsand Settings\[計算機用戶名]\LocalSettings\Application Data\[AssemblyCompany("huzongzhe")程序集中的一個屬性]\
???????? 2.若字段的屬性設置為[ApplicationScopedSetting()],則保存為[程序名].exe.config文件,
?????????? 保存位置:與可執行文件相同的目錄中。
????4.ToolStripManager.LoadSettings(this)和ToolStripManager.SaveSettings(this)方法解釋
?????? 首先,ToolStripManager提供Toolstrip相關類型的一些操作,包括合并,拆分toolstrip、呈現樣式、保存加載設置。
?????? 其次,LoadSettings、SaveSettings的位置是C:\Documentsand Settings\[計算機用戶名]\LocalSettings\Application Data\[AssemblyCompany("huzongzhe")程序集中的一個屬性]\
???????????? 與LocalFileSettingsProvider提供的文件配置是同一個位置,并且是同一個文件。??
????? 最后,LoadSettings的內容:Size、IsDefault、ItemOrder、Visible、ToolStripPanelName、Name、Location等7個屬性。
?
?
?(二),加載程序配置方法
???? 1.通過函數Binding來綁定,這樣在程序加載時直接與配置文件的數據綁定,并且可以在值改變時直接加載到XML中。
???????????Binding bndBackColor = new Binding("BackColor", frmSettings1,
???????????????"FormBackColor", true,DataSourceUpdateMode.OnPropertyChanged);
???????????this.DataBindings.Add(bndBackColor);
?
???? 2.通過提取的方法。這樣每次修改后不能動態改變,需要手動設置。
??????this.Size = frmSettings1.FormSize;
?(三),[SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]類屬性
???? 設置每個Toolstrip的前綴名,即每個組的前面限定名
???? 例如:tlbZoom工具條在配置文件中的標識-->System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm.tlbZoom
?
?(四),方法Reload();Reset();Save(); Upgrade();
?????? Reload()方法從配置文件重新加載值。
??????Reset() 方法將設置重置為默認值。
?????? Save() 方法保存當前設置的值。
??????Upgrade()更新程序設置值。
?
代碼示例:
[csharp] view plaincopy print?
[SettingsProvider("System.Configuration.LocalFileSettingsProvider")]??[SettingsGroupName("System.Windows.Forms.ToolStripSettings.MapWinGIS.MainProgram.MapWinForm")]?????sealedclass?ToolStripSettings?:?ApplicationSettingsBase?????{????????public?ToolStripSettings(string?settingsKey)?:?base(settingsKey)?????????{?????????}??????????[UserScopedSetting()]????????public?System.Drawing.Point?Location?????????{????????????get?????????????{????????????????if?(this["Location"]?==?null)?????????????????{????????????????????if?(this.GetPreviousVersion("Location")?==?null)????????????????????{?????????????????????????return?newSystem.Drawing.Point(-1,?-1);????????????????????}????????????????????return?((System.Drawing.Point)(this.GetPreviousVersion("Location")));????????????????}????????????????return?((System.Drawing.Point)(this["Location"]));?????????????}?????????????set?????????????{????????????????this["Location"]?=?value;?????????????}?????????}??????????[UserScopedSetting(),?DefaultSettingValue("StripDocker.Top")]????????public?string?ToolStripPanelName?????????{????????????get?????????????{????????????????if(string.IsNullOrEmpty((string)(this["ToolStripPanelName"])))????????????????{?????????????????????????????????????????if(string.IsNullOrEmpty((string)(this.GetPreviousVersion("ToolStripPanelName"))))????????????????????{????????????????????????????????????????????????return?string.Empty;????????????????????}????????????????????return?((string)(this.GetPreviousVersion("ToolStripPanelName")));????????????????}????????????????return?((string)(this["ToolStripPanelName"]));?????????????}???????????set?????????????{????????????????this["ToolStripPanelName"]?=?value;?????????????}?????????}??????????[UserScopedSetting()]????????[DefaultSettingValue("ImageAndText")]????????public?string?DisplayStyle?????????{????????????get?????????????{????????????????const?string?defaultValue?=?"ImageAndText";????????????????if?(this["DisplayStyle"]?==?null?||((string)(this["DisplayStyle"]))?==string.Empty)??????????????{????????????????????????????????????????if?(this.GetPreviousVersion("DisplayStyle")?==?null?||((string)(this.GetPreviousVersion("DisplayStyle")))==?string.Empty)?????????????????????{??????????????????????????????????????????????????return?defaultValue;????????????????????}????????????????????return?((string)(this.GetPreviousVersion("DisplayStyle")));????????????????}????????????????return?((string)(this["DisplayStyle"]));?????????????}????????????set?????????????{????????????????this["DisplayStyle"]?=?value;?????????????}?????????}?????}?
總結
以上是生活随笔為你收集整理的C#各种配置文件使用,操作方法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。