在.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;
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
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. ///
9. /// 说明:Config文件类型枚举,
10. /// 分别为asp.net网站的config文件和WinForm的config文件
11. /// 作者:周公
12. /// 日期:2008-08-23
13. ///
14. ///
15. public enum ConfigType
16. {
17. ///
18. /// asp.net网站的config文件
19. ///
20. WebConfig = 1,
21. ///
22. /// Windows应用程序的config文件
23. ///
24. ExeConfig = 2
25. }
26.
27. ///
28. /// 说明:本类主要负责对程序配置文件(.config)进行修改的类,
29. /// 可以对网站和应用程序的配置文件进行修改
30. /// 作者:周公
31. /// 日期:2008-08-23
32. /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
33. ///
34. public class ConfigurationOperator
35. {
36. private Configuration config;
37. private string configPath;
38. private ConfigType configType;
39.
40. ///
41. /// 对应的配置文件
42. ///
43. public Configuration Configuration
44. {
45. get { return config; }
46. set { config = value; }
47. }
48. ///
49. /// 构造函数
50. ///
51. /// "configType">.config文件的类型,只能是网站配置文件或者应用程序配置文件
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. ///
66. /// 构造函数
67. ///
68. /// "path">.config文件的位置
69. /// "type">.config文件的类型,只能是网站配置文件或者应用程序配置文件
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. ///
91. /// 添加应用程序配置节点,如果已经存在此节点,则会修改该节点的值
92. ///
93. /// "key">节点名称
94. /// "value">节点值
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. ///
108. /// 添加数据库连接字符串节点,如果已经存在此节点,则会修改该节点的值
109. ///
110. /// "key">节点名称
111. /// "value">节点值
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. ///
126. /// 修改应用程序配置节点,如果不存在此节点,则会添加此节点及对应的值
127. ///
128. /// "key">节点名称
129. /// "value">节点值
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. ///
143. /// 修改数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值
144. ///
145. /// "key">节点名称
146. /// "value">节点值
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. ///
160. /// 保存所作的修改
161. ///
void Save() void Save()
163. {
164. config.Save();
165. }
166. }
167. }
2. using System.Configuration;
3. using System.Web;
4. using System.Windows.Forms;
5.
6. namespace NetSkycn.Common
7. {
8. ///
9. /// 说明:Config文件类型枚举,
10. /// 分别为asp.net网站的config文件和WinForm的config文件
11. /// 作者:周公
12. /// 日期:2008-08-23
13. ///
14. ///
15. public enum ConfigType
16. {
17. ///
18. /// asp.net网站的config文件
19. ///
20. WebConfig = 1,
21. ///
22. /// Windows应用程序的config文件
23. ///
24. ExeConfig = 2
25. }
26.
27. ///
28. /// 说明:本类主要负责对程序配置文件(.config)进行修改的类,
29. /// 可以对网站和应用程序的配置文件进行修改
30. /// 作者:周公
31. /// 日期:2008-08-23
32. /// 首发地址:http://blog.csdn.net/zhoufoxcn/archive/2008/08/24/2823508.aspx
33. ///
34. public class ConfigurationOperator
35. {
36. private Configuration config;
37. private string configPath;
38. private ConfigType configType;
39.
40. ///
41. /// 对应的配置文件
42. ///
43. public Configuration Configuration
44. {
45. get { return config; }
46. set { config = value; }
47. }
48. ///
49. /// 构造函数
50. ///
51. /// "configType">.config文件的类型,只能是网站配置文件或者应用程序配置文件
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. ///
66. /// 构造函数
67. ///
68. /// "path">.config文件的位置
69. /// "type">.config文件的类型,只能是网站配置文件或者应用程序配置文件
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. ///
91. /// 添加应用程序配置节点,如果已经存在此节点,则会修改该节点的值
92. ///
93. /// "key">节点名称
94. /// "value">节点值
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. ///
108. /// 添加数据库连接字符串节点,如果已经存在此节点,则会修改该节点的值
109. ///
110. /// "key">节点名称
111. /// "value">节点值
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. ///
126. /// 修改应用程序配置节点,如果不存在此节点,则会添加此节点及对应的值
127. ///
128. /// "key">节点名称
129. /// "value">节点值
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. ///
143. /// 修改数据库连接字符串节点,如果不存在此节点,则会添加此节点及对应的值
144. ///
145. /// "key">节点名称
146. /// "value">节点值
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. ///
160. /// 保存所作的修改
161. ///
void Save() void Save()
163. {
164. config.Save();
165. }
166. }
167. }
用法实例:
(一)WebForm中的用法
(一)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();
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();//保存写入结果
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.
2.
3.
4.
5.
6.
7.
8.
9.
10.
2.
3.
4.
5.
6.
7.
8.
9.
10.
经过这个封装类可以简化对config配置文件的操作,仅仅是需要在实例化Configuration类的实例时指明打开的是网站还是应用程序的config文件,并且在进行了所有修改和增加操作之后调用Save()方法保存所做的修改即可。需要注意的是:要想把上面的程序作为类库编译,需要添加对System.Web.dll和System.Windows.Forms.dll和System.Configuration.dll类库的引用。