在.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类库的引用。