項目添加引用System.Configuration.dll,using System.Configuration; 應用程式配置文件是標準的 XML 文件,XML 標記和屬性是區分大小寫的。 configuration是根節點,我們經常訪問的是appSettings,它是由.Net預定義配置節所有 ...
項目添加引用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