net2.0中對config文件的操作方法總結

 在.net編程中,我們經常用到config文件來保存一些常用的應用程序配置信息,在WinForm中這個文件名字是app.config,在asp.net中叫web.config。這個.config文件其實就是一個xml文件,對它的讀操作微軟已經提供了一個類來實現了,這個類就是System.Configuration.ConfigurationManager,下面分別是例子:
  1. //讀取config里名稱爲“conn”數據庫連接信息
  2.      connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["conn"].ConnectionString;
  3. //讀取config里名稱爲"Font_Size"的應用程序配置信息
  4. System.Configuration.ConfigurationManager.AppSettings["Font-Size"] = 9;

不過利用這個類卻不能對config文件進行寫操作。對於config文件的寫操作,很多人通過xml的方式來進行,按照xml的方式進行寫操作在WinForm下雖然繁瑣點,但是畢竟能完成。以下是按照xml文件進行寫的例子。

  1. #region 保存配置
  2.             XmlDocument document = LoadXml();
  3.             XmlNode root = document.DocumentElement;
  4.             XmlNodeList nodeList = root.FirstChild.ChildNodes;
  5.             for (int i = 0; i < nodeList.Count; i++)
  6.             {
  7.                 string key = nodeList[i].Attributes["key"].Value;
  8.                 if (key == "FilterOption")
  9.                 {
  10.                     nodeList[i].Attributes["value"].Value = ((int)container.FilterOption).ToString();
  11.                 }
  12.             }
  13.             document.Save(configPath);
  14.             #endregion


但是在WebForm下,往往會因爲權限不足而報錯。如下圖:

本文提供了另外一種方式,利用.net2.0類庫裏面的Configuration來進行寫操作。詳細介紹請看下面的詳細介紹。

 

Configuration 是允許進行編程訪問以編輯配置文件的類。對於WebForm的config文件,可以用如下代碼得到Configuration類的實例:

  1. Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(configPath);

對於WinForm的config文件,可以用如下代碼得到Configuration類的實例:

 

  1. Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(configPath);

需要注意的是,對文件進行寫操作之後,需要調用Save()方法保存結果。整個程序的源代碼如下,並附有詳細代碼註釋。

  1. using System;
  2. using System.Configuration;
  3. using System.Web;
  4. using System.Windows.Forms;
  5. namespace NetSkycn.Common
  6. {
  7.     /// <summary>
  8.     /// 說明:Config文件類型枚舉,
  9.    /// 分別爲asp.net網站的config文件和WinForm的config文件
  10.     /// 作者:周公
  11.     /// 日期:2008-08-23
  12.     /// 首發地址:http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
  13.     /// </summary>
  14.     public enum ConfigType
  15.     {
  16.         /// <summary>
  17.         /// asp.net網站的config文件
  18.         /// </summary>
  19.         WebConfig = 1,
  20.         /// <summary>
  21.         /// Windows應用程序的config文件
  22.         /// </summary>
  23.         ExeConfig = 2
  24.     }
  25.     /// <summary>
  26.     /// 說明:本類主要負責對程序配置文件(.config)進行修改的類,
  27.     /// 可以對網站和應用程序的配置文件進行修改
  28.     /// 作者:周公
  29.     /// 日期:2008-08-23
  30.     /// 首發地址:http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
  31.     /// </summary>
  32.     public class ConfigurationOperator
  33.     {
  34.         private Configuration config;
  35.         private string configPath;
  36.         private ConfigType configType;
  37.         /// <summary>
  38.         /// 對應的配置文件
  39.         /// </summary>
  40.         public Configuration Configuration
  41.         {
  42.             get { return config; }
  43.             set { config = value; }
  44.         }
  45.         /// <summary>
  46.         /// 構造函數
  47.         /// </summary>
  48.         /// <param name="configType">.config文件的類型,只能是網站配置文件或者應用程序配置文件</param>
  49.         public ConfigurationOperator(ConfigType configType)
  50.         {
  51.             this.configType = configType;
  52.             if (configType == ConfigType.ExeConfig)
  53.             {
  54.                 configPath = Application.ExecutablePath; //AppDomain.CurrentDomain.BaseDirectory;
  55.             }
  56.             else
  57.             {
  58.                 configPath = HttpContext.Current.Request.ApplicationPath;
  59.             }
  60.             Initialize();
  61.         }
  62.         /// <summary>
  63.         /// 構造函數
  64.         /// </summary>
  65.         /// <param name="path">.config文件的位置</param>
  66.         /// <param name="type">.config文件的類型,只能是網站配置文件或者應用程序配置文件</param>
  67.         public ConfigurationOperator(string configPath, ConfigType configType)
  68.         {
  69.             this.configPath = configPath;
  70.             this.configType = configType;
  71.             Initialize();
  72.         }
  73.         //實例化configuration,根據配置文件類型的不同,分別採取了不同的實例化方法
  74.         private void Initialize()
  75.         {
  76.             //如果是WinForm應用程序的配置文件
  77.             if (configType == ConfigType.ExeConfig)
  78.             {
  79.                 config = System.Configuration.ConfigurationManager.OpenExeConfiguration(configPath);
  80.             }
  81.             else//WebForm的配置文件
  82.             {
  83.                 config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(configPath);
  84.             }
  85.         }
  86.         /// <summary>
  87.         /// 添加應用程序配置節點,如果已經存在此節點,則會修改該節點的值
  88.         /// </summary>
  89.         /// <param name="key">節點名稱</param>
  90.         /// <param name="value">節點值</param>
  91.         public void AddAppSetting(string key, string value)
  92.         {
  93.             AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
  94.             if (appSetting.Settings[key] == null)//如果不存在此節點,則添加
  95.             {
  96.                 appSetting.Settings.Add(key, value);
  97.             }
  98.             else//如果存在此節點,則修改
  99.             {
  100.                 ModifyAppSetting(key, value);
  101.             }
  102.         }
  103.         /// <summary>
  104.         /// 添加數據庫連接字符串節點,如果已經存在此節點,則會修改該節點的值
  105.         /// </summary>
  106.         /// <param name="key">節點名稱</param>
  107.         /// <param name="value">節點值</param>
  108.         public void AddConnectionString(string key, string connectionString)
  109.         {
  110.             ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
  111.             if (connectionSetting.ConnectionStrings[key] == null)//如果不存在此節點,則添加
  112.             {
  113.                 ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString);
  114.                 connectionSetting.ConnectionStrings.Add(connectionStringSettings);
  115.             }
  116.             else//如果存在此節點,則修改
  117.             {
  118.                 ModifyConnectionString(key, connectionString);
  119.             }
  120.         }
  121.         /// <summary>
  122.         /// 修改應用程序配置節點,如果不存在此節點,則會添加此節點及對應的值
  123.         /// </summary>
  124.         /// <param name="key">節點名稱</param>
  125.         /// <param name="value">節點值</param>
  126.         public void ModifyAppSetting(string key, string newValue)
  127.         {
  128.             AppSettingsSection appSetting = (AppSettingsSection)config.GetSection("appSettings");
  129.             if (appSetting.Settings[key] != null)//如果存在此節點,則修改
  130.             {
  131.                 appSetting.Settings[key].Value = newValue;
  132.             }
  133.             else//如果不存在此節點,則添加
  134.             {
  135.                 AddAppSetting(key, newValue);
  136.             }
  137.         }
  138.         /// <summary>
  139.         /// 修改數據庫連接字符串節點,如果不存在此節點,則會添加此節點及對應的值
  140.         /// </summary>
  141.         /// <param name="key">節點名稱</param>
  142.         /// <param name="value">節點值</param>
  143.         public void ModifyConnectionString(string key, string connectionString)
  144.         {
  145.             ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
  146.             if (connectionSetting.ConnectionStrings[key] != null)//如果存在此節點,則修改
  147.             {
  148.                 connectionSetting.ConnectionStrings[key].ConnectionString = connectionString;
  149.             }
  150.             else//如果不存在此節點,則添加
  151.             {
  152.                 AddConnectionString(key, connectionString);
  153.             }
  154.         }
  155.         /// <summary>
  156.         /// 保存所作的修改
  157.         /// </summary>
  158.         public void Save()
  159.         {
  160.             config.Save();
  161.         }
  162.     }
  163. }

 

用法實例:
(一)WebForm中的用法

 

  1. ConfigurationOperator co = new ConfigurationOperator(ConfigType.WebConfig);
  2.         string key = txtConnectionStringKey.Text;
  3.         string value = txtConnectionStringValue.Text;
  4.         co.AddConnectionString(key, value);
  5.         co.Save();

(二)WinForm中的用法

  1. ConfigurationOperator co = new ConfigurationOperator(ConfigType.ExeConfig);
  2.             co.AddAppSetting("Font-Size""9");
  3.             co.AddAppSetting("WebSite""http://blog.csdn.net/zhoufoxcn");
  4.             co.AddConnectionString("Connection""test");
  5.             co.Save();//保存寫入結果

我在WinForm里加入了一個空白的app.config文件,經過上面的操作得到如下結果(這個文件是和最後生成的exe文件在同一個目錄下,而不是和源代碼在同一文件夾下的那個config文件):

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3.     <appSettings>
  4.         <add key="Font-Size" value="9" />
  5.         <add key="WebSite" value="http://blog.csdn.net/zhoufoxcn" />
  6.     </appSettings>
  7.     <connectionStrings>
  8.         <add name="Connection" connectionString="test" />
  9.     </connectionStrings>
  10. </configuration>

經過這個封裝類可以簡化對config配置文件的操作,僅僅是需要在實例化Configuration類的實例時指明打開的是網站還是應用程序的config文件,並且在進行了所有修改和增加操作之後調用Save()方法保存所做的修改即可。需要注意的是:要想把上面的程序作爲類庫編譯,需要添加對System.Web.dll和System.Windows.Forms.dll和System.Configuration.dll類庫的引用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章