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