C#的配置文件App.config使用總結 - 轉


http://blog.csdn.net/celte/article/details/9749389

 

首先,先說明,我使用的app.config 配置文件的格式如下:

 

  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <configuration>  
  3.   <appSettings>  
  4.       
  5.     <add key="ServerIP" value="127.0.0.1"></add>  
  6.       
  7.     <add key="DataBase" value="WarehouseDB"></add>  
  8.   
  9.     <add key="user" value="sa"></add>  
  10.   
  11.     <add key="password" value="sa"></add>  
  12.   
  13.   </appSettings>  
  14. </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>

因此,對於配置文件的讀取方式如下:(依然由上面的文件舉一個簡單的例子)

 

 

[csharp] view plain copy print ?
  1. 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中的值:

[csharp] view plain copy print ?
  1. Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
  2. config.AppSettings.Settings["DB_UID"].Value = "demo";  
  3. 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這句話來直接獲取當前程序的配置文件的位置,具體原因,后面再敘述。

這里給出我常用的操作函數。

 

[csharp] view plain copy print ?
  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. }  
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來獲取當前運行程序的配置文件。

當然啦,這一點差異不要着急,等程序調試完畢后,以后,程序一般就是從文件夾手動啟動的啦,這個時候,就沒有上面的那么多問題的了。一切會恢復正常!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM