在.net編程中,我們經常用到config文件來保存一些常用的應用程序配置信 息,在WinForm中這個文件名字是app.config,在asp.net中叫web.config。這個 .config文件其實就是一個xml文件,對它的讀操作微軟已經提供了一個類來實現 了,這個類就是System.Configuration.ConfigurationManager,下面分別是例 子:
//讀取config裡名稱為“conn”數據庫連接信息
connectionString = System.Configuration.ConfigurationManager.ConnectionStrings ["conn"].ConnectionString;
//讀取config裡名稱為"Font_Size"的應用程序配置信息
System.Configuration.ConfigurationManager.AppSettings["Font- Size"] = 9;
不過利用這個類卻不能對config文件進行寫操作。對於config文件的寫操作 ,很多人通過xml的方式來進行,按照xml的方式進行寫操作在WinForm下雖然繁 瑣點,但是畢竟能完成。以下是按照xml文件進行寫的例子。
#region 保存配置
XmlDocument document = LoadXml();
XmlNode root = document.DocumentElement;
XmlNodeList nodeList = root.FirstChild.ChildNodes;
for (int i = 0; i < nodeList.Count; i++)
{
string key = nodeList[i].Attributes ["key"].Value;
if (key == "FilterOption")
{
nodeList[i].Attributes["value"].Value = ((int) container.FilterOption).ToString();
}
}
document.Save(configPath);
#endregion
但是在WebForm下,往往會因為權限不足而報錯。如下圖:
本文提供了另外一種方式,利用.net2.0類庫裡面的Configuration來進行寫 操作。詳細介紹請看下面的詳細介紹。
Configuration 是允許進行編程訪問以編輯配置文件的類。對於WebForm的 config文件,可以用如下代碼得到Configuration類的實例:
Configuration config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration (configPath);
對於WinForm的config文件,可以用如下代碼得到Configuration類的實例:
Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration (configPath);
需要注意的是,對文件進行寫操作之後,需要調用Save()方法保存結果。整 個程序的源代碼如下,並附有詳細代碼注釋。
using System;
using System.Configuration;
using System.Web;
using System.Windows.Forms;
namespace NetSkycn.Common
{
/// <summary>
/// 說明:Config文件類型枚舉,
/// 分別為asp.net網站的config文件和WinForm的config文件
/// 作者:周公
/// 日期:2008-08-23
/// 首發地址: http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
/// </summary>
public enum ConfigType
{
/// <summary>
/// asp.net網站的config文件
/// </summary>
WebConfig = 1,
/// <summary>
/// Windows應用程序的config文件
/// </summary>
ExeConfig = 2
}
/// <summary>
/// 說明:本類主要負責對程序配置文件(.config)進行修改的類,
/// 可以對網站和應用程序的配置文件進行修改
/// 作者:周公
/// 日期:2008-08-23
/// 首發地址: http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
/// </summary>
public class ConfigurationOperator
{
private Configuration config;
private string configPath;
private ConfigType configType;
/// <summary>
/// 對應的配置文件
/// </summary>
public Configuration Configuration
{
get { return config; }
set { config = value; }
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="configType">.config文件的類型,只能 是網站配置文件或者應用程序配置文件</param>
public ConfigurationOperator(ConfigType configType)
{
this.configType = configType;
if (configType == ConfigType.ExeConfig)
{
configPath = Application.ExecutablePath; //AppDomain.CurrentDomain.BaseDirectory;
}
else
{
configPath = HttpContext.Current.Request.ApplicationPath;
}
Initialize();
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="path">.config文件的位置 </param>
/// <param name="type">.config文件的類型,只能是網站 配置文件或者應用程序配置文件</param>
public ConfigurationOperator(string configPath, ConfigType configType)
{
this.configPath = configPath;
this.configType = configType;
Initialize();
}
//實例化configuration,根據配置文件類型的不同,分別采取了不 同的實例化方法
private void Initialize()
{
//如果是WinForm應用程序的配置文件
if (configType == ConfigType.ExeConfig)
{
config = System.Configuration.ConfigurationManager.OpenExeConfiguration (configPath);
}
else//WebForm的配置文件
{
config = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration (configPath);
}
}
/// <summary>
/// 添加應用程序配置節點,如果已經存在此節點,則會修改該節 點的值
/// </summary>
/// <param name="key">節點名稱</param>
/// <param name="value">節點值</param>
public void AddAppSetting(string key, string value)
{
AppSettingsSection appSetting = (AppSettingsSection) config.GetSection("appSettings");
if (appSetting.Settings[key] == null)//如果不存在此節點 ,則添加
{
appSetting.Settings.Add(key, value);
}
else//如果存在此節點,則修改
{
ModifyAppSetting(key, value);
}
}
/// <summary>
/// 添加數據庫連接字符串節點,如果已經存在此節點,則會修改 該節點的值
/// </summary>
/// <param name="key">節點名稱</param>
/// <param name="value">節點值</param>
public void AddConnectionString(string key, string connectionString)
{
ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
if (connectionSetting.ConnectionStrings[key] == null)// 如果不存在此節點,則添加
{
ConnectionStringSettings connectionStringSettings = new ConnectionStringSettings(key, connectionString);
connectionSetting.ConnectionStrings.Add (connectionStringSettings);
}
else//如果存在此節點,則修改
{
ModifyConnectionString(key, connectionString);
}
}
/// <summary>
/// 修改應用程序配置節點,如果不存在此節點,則會添加此節點 及對應的值
/// </summary>
/// <param name="key">節點名稱</param>
/// <param name="value">節點值</param>
public void ModifyAppSetting(string key, string newValue)
{
AppSettingsSection appSetting = (AppSettingsSection) config.GetSection("appSettings");
if (appSetting.Settings[key] != null)//如果存在此節點, 則修改
{
appSetting.Settings[key].Value = newValue;
}
else//如果不存在此節點,則添加
{
AddAppSetting(key, newValue);
}
}
/// <summary>
/// 修改數據庫連接字符串節點,如果不存在此節點,則會添加此 節點及對應的值
/// </summary>
/// <param name="key">節點名稱</param>
/// <param name="value">節點值</param>
public void ModifyConnectionString(string key, string connectionString)
{
ConnectionStringsSection connectionSetting = (ConnectionStringsSection)config.GetSection("connectionStrings");
if (connectionSetting.ConnectionStrings[key] != null)// 如果存在此節點,則修改
{
connectionSetting.ConnectionStrings [key].ConnectionString = connectionString;
}
else//如果不存在此節點,則添加
{
AddConnectionString(key, connectionString);
}
}
/// <summary>
/// 保存所作的修改
/// </summary>
public void Save()
{
config.Save();
}
}
}
用法實例:
(一)WebForm中的用法
ConfigurationOperator co = new ConfigurationOperator (ConfigType.WebConfig);
string key = txtConnectionStringKey.Text;
string value = txtConnectionStringValue.Text;
co.AddConnectionString(key, value);
co.Save();
(二)WinForm中的用法
ConfigurationOperator co = new ConfigurationOperator (ConfigType.ExeConfig);
co.AddAppSetting("Font-Size", "9");
co.AddAppSetting("WebSite", "http://blog.csdn.net/zhoufoxcn");
co.AddConnectionString("Connection", "test");
co.Save();//保存寫入結果
我在WinForm裡加入了一個空白的app.config文件,經過上面的操作得到如下 結果(這個文件是和最後生成的exe文件在同一個目錄下,而不是和源代碼在同 一文件夾下的那個config文件):
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Font-Size" value="9" />
<add key="WebSite" value="http://blog.csdn.net/zhoufoxcn" />
</appSettings>
<connectionStrings>
<add name="Connection" connectionString="test" />
</connectionStrings>
</configuration>
經過這個封裝類可以簡化對config配置文件 的操作,僅僅是需要在實例化Configuration類的實例時指明打開的是網站還是 應用程序的config文件,並且在進行了所有修改和增加操作之後調用Save()方法 保存所做的修改即可。需要注意的是:要想把上面的程序作為類庫編譯,需要添 加對System.Web.dll和System.Windows.Forms.dll和System.Configuration.dll 類庫的引用。