Config文件的使用:通過程序修改Config文件


對於config文件,一般情況下都是使用ConfigurationManager加載,然后通過讀取相應節點的值來獲取想要的數據,但是,有時候需要修改config文件的值,這時候就用到了OpenExeConfiguration()方法。

MSDN上面對該方法的解釋:ConfigurationManager.OpenExeConfiguration方法用來把指定的客戶端配置文件作為Configuration對象打開,該方法具有兩個重載:

名稱 說明
ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel) 將當前應用程序的配置文件作為 Configuration 對象打開。
ConfigurationManager.OpenExeConfiguration (String) 將指定的客戶端配置文件作為 Configuration 對象打開。

一、使用OpenExeConfiguration(ConfigurationUserLevel)重載設置當前應用程序的配置文件

客戶端應用程序使用應用於所有用戶的全局配置、應用於單個用戶的單獨配置以及應用於漫游用戶的配置。userLevel 參數通過指示該配置文件是不具有用戶級別(配置文件與應用程序位於同一目錄中),還是具有一個依每個用戶而定的用戶級別(配置文件位於用戶級別所確定的應用程序設置路徑中),從而確定所打開的配置文件的位置。

通過向 userLevel 傳遞下列值之一來指定要獲取的配置:

  • 若要獲取應用於所有用戶的 Configuration 對象,請將 userLevel 設置為 None。

  • 若要獲取應用於當前用戶的本地 Configuration 對象,請將 userLevel 設置為 PerUserRoamingAndLocal。

  • 若要獲取應用於當前用戶的漫游 Configuration 對象,請將 userLevel 設置為 PerUserRoaming。

注意:若要獲取資源的 Configuration 對象,您的代碼必須對它從中繼承設置的所有配置文件具有“讀取”特權。若要更新配置文件,您的代碼還必須對該配置文件及其所在目錄具有“寫入”特權。

示例程序:

1、配置文件結構如下:

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <configuration>
 3   <appSettings>
 4     <add key="ApServer1" value="ApServer1"/>
 5     <add key="ApServer2" value="ApServer2"/>
 6     <add key="LocalHost1" value="LocalHost1"/>
 7     <add key="LocalHost2" value="LocalHost2"/>
 8     <add key="addr" value="11111"/>
 9   </appSettings>
10     <startup> 
11         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
12     </startup>
13 </configuration>

2、通過程序修改LocalHost1節點的值

 string strLocalHost1Value1 = ConfigurationManager.AppSettings["LocalHost1"].ToString(); //strLocalHost1Value1="LocalHost1";
//Configuration對象
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["LocalHost1"].Value = "http://127.0.0.1";

//保存配置文件
config.AppSettings.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Modified);
//重新加載改變的節點
ConfigurationManager.RefreshSection("appSettings");

//讀取配置文件的值
string strLocalHost1Value2 = ConfigurationManager.AppSettings["LocalHost1"].ToString();//strLocalHost1Value2="http://127.0.0.1"

二、使用OpenExeConfiguration(String)重載設置指定的客戶端配置文件

重載指定的客戶端config文件主要包括下面3種情況:

1、加載非當前應用程序yyy.exe默認的config文件的xxx.exe.config文件(yyy.exe是當前應用程序,xxx.exe.config與yyy.exe.config文件不在同一目錄下)。

2、加載非應用程序的xxx.config文件。

3、讓類庫xxx.dll內的函數讀取默認config文件的時候,讀取的是xxx.dll同級目錄下的xxx.dll.config文件,而不是加載xxx.dll的應用程序yyy.exe的默認應用程序配置文件:yyy.exe.config。

注意:在類庫中使用ConfigruationManager讀取的不是自動編譯生成的xxx.dll.config文件,而是引用類庫的應用程序yyy.exe的yyy.exe.config文件。

解決方法:

按照MSDN上的說明,我們把要打開的xxx.exe.config的路徑作為參數傳入,代碼如下:

1 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe.config");
2 con.AppSettings.Settings["LocalHost2"].Value = "測試";

但是程序運行的時候報錯,經過調試,發現con對象的FilePath屬性的值為:C:\Modify.exe.config.config,程序自己在傳入的參數后增加了“.config”作為要打開的config文件的路徑,因為沒有這個文件,所以程序報錯。這里要傳入的參數,不應該是要打開的config文件的路徑,而是這個config文件對應的應用程序的路徑,上面的代碼應修改為:

1 //參數傳的是應用程序的路徑
2 Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe.");
3 con.AppSettings.Settings["LocalHost2"].Value = "測試";

再次運行程序,還是報錯,提示“加載配置文件時出錯:參數exePath”無效。這里要傳入應用程序的路徑(exePath)沒錯,但是因為在xxx.exe.config文件的同一目錄下,沒有xxx.exe文件,因此我們傳入的exePath實際上是無效的,為了能夠加載xxx.exe.config文件,需要在同一目錄下增加一個xxx.exe文件。(可以在同一目錄下新建一個txt文件,修改名稱為xxx,擴展名為.exe,這樣就可以加載xxx.exe.config配置文件了)

完整的代碼如下:

//參數傳的是應用程序的路徑
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe");
con.AppSettings.Settings["LocalHost2"].Value = "測試";
//保存配置文件
con.AppSettings.SectionInformation.ForceSave = true;
con.Save(ConfigurationSaveMode.Modified);
//重新加載改變的節點
ConfigurationManager.RefreshSection("appSettings");

//讀取修改后的配置文件節點值
string str = con.AppSettings.Settings["LocalHost2"].Value;//str="測試"

注意:

使用ConfigurationManager.OpenExeConfiguration(string exePath)即可,同時注意2個小細節:
A:改方法需傳入的是exePath,而不是configPath;
B:exePath必須是有效的,因此xxx.exe和xxx.exe.config應該成對出現,缺一不可。

加載非應用程序的xxx.config文件

在上面的例子中,觀察xxx.exe.config文件的名稱,發現,若把xxx.exe看成YYY,則xxx.exe.config=YYY.config,也就是說:xxx.exe.config是xxx.config文件的一種特殊形式,所以,可以使用如下的代碼加載xx.config文件:

//參數傳的是應用程序的路徑
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify");
con.AppSettings.Settings["LocalHost2"].Value = "測試";
//保存配置文件
con.AppSettings.SectionInformation.ForceSave = true;
con.Save(ConfigurationSaveMode.Modified);
//重新加載改變的節點
ConfigurationManager.RefreshSection("appSettings");

//讀取修改后的配置文件節點值
string str = con.AppSettings.Settings["LocalHost2"].Value;//str="測試"

注意:C:\Modify這個文件必須要有。

加載xxx.dll.config文件:

還是從文件名上來找思路,我們要加載xxx.dll.config文件,可以和加載xxx.config文件一樣。在dll內,碰到需要讀取config文件信息的時候,放棄使用ConfigurationManager讀取節點的值,而是使用OpenExeConfiguration(string exePath)方法加載config文件為一個Configuration對象來使用。

注意:通過程序修改配置文件中節點的值,不會修改.config文件里面的值,更改只是發生在內存中。

 


免責聲明!

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



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