http://blog.csdn.net/celte/article/details/9749389
首先,先說明,我使用的app.config 配置文件的格式如下:
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <appSettings>
- <add key="ServerIP" value="127.0.0.1"></add>
- <add key="DataBase" value="WarehouseDB"></add>
- <add key="user" value="sa"></add>
- <add key="password" value="sa"></add>
- </appSettings>
- </configuration>
<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="ServerIP" value="127.0.0.1"></add> <add key="DataBase" value="WarehouseDB"></add> <add key="user" value="sa"></add> <add key="password" value="sa"></add> </appSettings> </configuration>
因此,對於配置文件的讀取方式如下:(依然由上面的文件舉一個簡單的例子)
- static string str = "Data Source=" + System.Configuration.ConfigurationManager.AppSettings["ServerIP"] + ";Initial Catalog =" + System.Configuration.ConfigurationManager.AppSettings["DataBase"] + "; User ID=" + System.Configuration.ConfigurationManager.AppSettings["user"] + "; Password=" + System.Configuration.ConfigurationManager.AppSettings["password"] ;
static string str = "Data Source=" + System.Configuration.ConfigurationManager.AppSettings["ServerIP"] + ";Initial Catalog =" + System.Configuration.ConfigurationManager.AppSettings["DataBase"] + "; User ID=" + System.Configuration.ConfigurationManager.AppSettings["user"] + "; Password=" + System.Configuration.ConfigurationManager.AppSettings["password"] ;
這樣,便從配置文件中讀取出了所需要的信息,組成了一組用於連接數據庫的字符串。
對於修改配置文件 的話,
很多文章都介紹用下面的方法修改app.config中的值:
- Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
- config.AppSettings.Settings["DB_UID"].Value = "demo";
- config.Save(ConfigurationSaveMode.Full);
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); config.AppSettings.Settings["DB_UID"].Value = "demo"; config.Save(ConfigurationSaveMode.Full);
事實證明這種做法是不可行的。雖然程序運行時的值已經被修改。但是打開app.config查看,會看到值仍然沒有被改動。如果重啟程序,就會使用以前的舊值。用這種方法只可以讀取值。不能寫入或者修改值。
注意,正確的做法是,把配置文件按照普通的xml文件來進行修改,否則,經常出現的問題就是你所修改的東西其實最后根本沒有寫入文件!最后還是修改失敗!
當作普通的xml文件讀取的話,首先就要知道怎么尋找文件的路徑。我們知道一般配置文件就在跟可執行exe文件在同一目錄下,且僅僅在名稱后面添加了一個.config 因此,可以用Application.ExecuteablePath+".cofig"的方式來獲得,不過更加推薦使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile這句話來直接獲取當前程序的配置文件的位置,具體原因,后面再敘述。
這里給出我常用的操作函數。
- using System.Xml;
- //第一個參數是xml文件中的add節點的value,第二個參數是add節點的key
- private void SaveConfig(string ConnenctionString, string strKey)
- {
- XmlDocument doc = new XmlDocument();
- //獲得配置文件的全路徑
- string strFileName = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
- // string strFileName= AppDomain.CurrentDomain.BaseDirectory + "\\exe.config";
- doc.Load(strFileName);
- //找出名稱為“add”的所有元素
- XmlNodeList nodes = doc.GetElementsByTagName("add");
- for (int i = 0; i < nodes.Count; i++)
- {
- //獲得將當前元素的key屬性
- XmlAttribute att = nodes[i].Attributes["key"];
- //根據元素的第一個屬性來判斷當前的元素是不是目標元素
- if (att.Value == strKey)
- {
- //對目標元素中的第二個屬性賦值
- att = nodes[i].Attributes["value"];
- att.Value = ConnenctionString;
- break;
- }
- }
- //保存上面的修改
- doc.Save(strFileName);
- System.Configuration.ConfigurationManager.RefreshSection("appSettings");
- }
using System.Xml; //第一個參數是xml文件中的add節點的value,第二個參數是add節點的key private void SaveConfig(string ConnenctionString, string strKey) { XmlDocument doc = new XmlDocument(); //獲得配置文件的全路徑 string strFileName = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; // string strFileName= AppDomain.CurrentDomain.BaseDirectory + "\\exe.config"; doc.Load(strFileName); //找出名稱為“add”的所有元素 XmlNodeList nodes = doc.GetElementsByTagName("add"); for (int i = 0; i < nodes.Count; i++) { //獲得將當前元素的key屬性 XmlAttribute att = nodes[i].Attributes["key"]; //根據元素的第一個屬性來判斷當前的元素是不是目標元素 if (att.Value == strKey) { //對目標元素中的第二個屬性賦值 att = nodes[i].Attributes["value"]; att.Value = ConnenctionString; break; } } //保存上面的修改 doc.Save(strFileName); System.Configuration.ConfigurationManager.RefreshSection("appSettings"); }
現在回過頭還是看上面的這個函數,看它的最后一行,它的作用是什么?
查找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來獲取當前運行程序的配置文件。
當然啦,這一點差異不要着急,等程序調試完畢后,以后,程序一般就是從文件夾手動啟動的啦,這個時候,就沒有上面的那么多問題的了。一切會恢復正常!