一.使用说明:
//
编辑web.config文件
//
打开配置文件
Configuration config
=
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(
"
~
"
);
//
获取appsettings节点
AppSettingsSection appsection
=
(AppSettingsSection)config.GetSection(
"
appSettings
"
);
//
在appsettings节点中添加元素
appsection.Settings.Add(
"
addkey1
"
,
"
key1's value
"
);
appsection.Settings.Add(
"
addkey2
"
,
"
key2's value
"
);
config.Save();
//
删除节点或属性
//
打开配置文件
Configuration config
=
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(
"
~
"
);
//
获取appsettings节点
AppSettingsSection appsection
=
(AppSettingsSection)config.GetSection(
"
appSettings
"
);
//
删除appsettings节点中的元素
appsection.Settings.Remove(
"
addkey1
"
);
//
修改appsettings节点中的元素
appsection.Settings[
"
addkey2
"
].Value
=
"
modify key2's value
"
;
config.Save();
//
编辑App.config文件
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
@"
.... est.config
"
;
//
打开配置文件
Configuration myConfig
=
System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
//
获取appsettings节点
AppSettingsSection appsection
=
(AppSettingsSection)myConfig.GetSection(
"
appSettings
"
);
//
在appsettings节点中添加元素
appsection.Settings.Add(
"
addkey1
"
,
"
key1's value
"
);
appsection.Settings.Add(
"
addkey2
"
,
"
key2's value
"
);
config.Save();
//
删除节点或属性
//
打开配置文件
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
@"
.... est.config
"
;
//
打开配置文件
Configuration myConfig
=
System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
//
获取appsettings节点
AppSettingsSection appsection
=
(AppSettingsSection)myConfig.GetSection(
"
appSettings
"
);
//
删除appsettings节点中的元素
appsection.Settings.Remove(
"
addkey1
"
);
//
修改appsettings节点中的元素
appsection.Settings[
"
addkey2
"
].Value
=
"
modify key2's value
"
;
myConfig.Save();
二.详细介绍
1. 创建配置节类
必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样
class
ConfigSectionData : ConfigurationSection
...
{
[ConfigurationProperty("id")]
public int Id
...{
get 
...{
return (int)this["id"];
}
set 
...{
this["id"] = value;
}
}
[ConfigurationProperty("time")]
public DateTime Time
...{
get 
...{
return (DateTime)this["time"];
}
set 
...{
this["time"] = value;
}
}
}
Configuration config
=
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigSectionData data
=
new
ConfigSectionData();
data.Id
=
1000
;
data.Time
=
DateTime.Now;
config.Sections.Add(
"
add
"
, data);
config.Save(ConfigurationSaveMode.Minimal);
上面的例子是操作 app.config,在根节点(configuration)下写入名称为"add"的配置数据。
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="add"
type
="ConsoleApplication1.ConfigSectionData, ... />
</configSections>
<add id="
1000" time
="02/18/2006 21:51:06"
/>
</
configuration
>
需要注意的 VS2005 在IDE模式下会将信息写入 *.vshost.exe.config,并且在程序关闭时覆写该文件,因此您可能看不到您写入的配置数据,
只要在资源管理其中执行 *.exe 文件,您就可以在 *.exe.config 文件中看到结果了。
如果我们需要操作非缺省配置文件,可以使用ExeConfigurationFileMap对象。
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
"
test.config
"
;
Configuration config
=
ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
ConfigSectionData data
=
new
ConfigSectionData();
data.Id
=
1000
;
data.Time
=
DateTime.Now;
config.Sections.Add(
"
add
"
, data);
config.Save(ConfigurationSaveMode.Minimal);
如果我们不希望在根节点下写入配置数据,可以使用ConfigurationSectionGroup对象。
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
"
test.config
"
;
Configuration config
=
ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
ConfigSectionData data
=
new
ConfigSectionData();
data.Id
=
1000
;
data.Time
=
DateTime.Now;
config.SectionGroups.Add(
"
group1
"
,
new
ConfigurationSectionGroup());
config.SectionGroups[
"
group1
"
].Sections.Add(
"
add
"
, data);
config.Save(ConfigurationSaveMode.Minimal);
下面就是生成的配置文件。
3. 读取配置文件
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
"
test.config
"
;
Configuration config
=
ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
ConfigSectionData data
=
config.SectionGroups[
"
group1
"
].Sections[
"
add
"
]
as
ConfigSectionData;
//
ConfigSectionData data = config.Sections["add"] as ConfigSectionData;
//
从根节读取
if
(data
!=
null
)
...
{
Console.WriteLine(data.Id);
Console.WriteLine(data.Time);
}
在写入 ConfigurationSectionGroup 和 ConfigurationSection 前要判断同名配置是否已经存在,否则会写入失败。
另外如果配置文件被其他Configuration对象修改,则保存会失败,并抛出异常。建议采用Singleton模式。
ExeConfigurationFileMap file
=
new
ExeConfigurationFileMap();
file.ExeConfigFilename
=
"
test.config
"
;
Configuration config
=
ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
ConfigSectionData data
=
new
ConfigSectionData();
data.Id
=
2000
;
data.Time
=
DateTime.Now;
ConfigurationSectionGroup group1
=
config.SectionGroups[
"
group1
"
];
if
(group1
==
null
)
config.SectionGroups.Add(
"
group1
"
,
new
ConfigurationSectionGroup());
ConfigurationSection data
=
group1.Sections[
"
add
"
]
as
config;
if
(add
==
null
)
config.SectionGroups[
"
group1
"
].Sections.Add(
"
add
"
, data);
else

...
{
group1.Sections.Remove("add");
group1.Sections.Add("add", data);
// 或者直接修改原配置对象,前提是类型转换要成功。
//ConfigSectionData configData = add as ConfigSectionData;
//configData.Id = data.Id;
//configData.Time = data.Time;
}
config.Save(ConfigurationSaveMode.Minimal);
删除ConfigurationSectionGroup
config.SectionGroups.Remove(
"
group1
"
);
//
config.SectionGroups.Clear();
config.Save(ConfigurationSaveMode.Minimal);

删除ConfigurationSection
config.Sections.Remove(
"
add1
"
);
//
config.Sections.Clear();
if
(config.SectionGroups[
"
group1
"
]
!=
null
)
...
{
config.SectionGroups["group1"].Sections.Remove("add2");
//config.SectionGroups["group1"].Sections.Clear();
}
config.Save(ConfigurationSaveMode.Minimal);
6. 其他
可以使用 ConfigurationManager.OpenMachineConfiguration() 来操作 Machine.config 文件。
或者使用 System.Web.Configuration 名字空间中的 WebConfigurationManager 类来操作 ASP.NET 配置文件。
ConfigurationManager还提供了AppSettings、ConnectionStrings、GetSection()等便捷操作。
7. 使用自定义类
比如ConfigSectionData里面
除了简单类型之外,可不可以有自定义的类
可以使用自定义类,不过需要定义一个转换器。
using
System;
using
System.Collections;
using
System.Collections.Generic;
using
System.Configuration;
using
System.Globalization;
using
System.ComponentModel;
//
要写入配置文件的自定义类
class
CustomData
...
{
public CustomData(string s)
...{
this.s = s;
}
private string s;
public string S
...{
get ...{ return s; }
set ...{ s = value; }
}
}
//
自定义的转换器(演示代码省略了类型判断)
class
CustomConvert : ConfigurationConverterBase
...
{
public override bool CanConvertFrom(ITypeDescriptorContext ctx, Type type)
...{
return (type == typeof(string));
}
public override object ConvertTo(ITypeDescriptorContext ctx, CultureInfo ci, object value, Type type)
...{
return (value as CustomData).S;
}
public override object ConvertFrom(ITypeDescriptorContext ctx, CultureInfo ci, object data)
...{
return new CustomData((string)data); ;
}
}
class
ConfigSectionData : ConfigurationSection
...
{
[ConfigurationProperty("id")]
public int Id
...{
get ...{ return (int)this["id"]; }
set ...{ this["id"] = value; }
}
[ConfigurationProperty("time")]
public DateTime Time
...{
get ...{ return (DateTime)this["time"]; }
set ...{ this["time"] = value; }
}
[ConfigurationProperty("custom")]
[TypeConverter(typeof(CustomConvert))] // 指定转换器
public CustomData Custom
...{
get ...{ return (CustomData)this["custom"]; }
set ...{ this["custom"] = value; }
}
}
public
class
Program
...
{
static void Main(string[] args)
...{
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
ConfigSectionData data = new ConfigSectionData();
data.Id = 1000;
data.Time = DateTime.Now;
data.Custom = new CustomData("abcdefg...");
config.Sections.Add("add", data);
config.Save(ConfigurationSaveMode.Minimal);
// 读取测试
ConfigSectionData configData = (ConfigSectionData)config.Sections["add"];
Console.WriteLine(configData.Custom.S);
}
}
保存后的配置文件
<?
xml version="1.0" encoding="utf-8"
?>
<
configuration
>
<
configSections
>
<
section
name
="add"
type
="..."
/>
</
configSections
>
<
add
id
="1000"
time
="04/17/2006 22:06:58"
custom
="abcdefg..."
/>
</
configuration
>
本文详细介绍了配置文件的操作,包括如何创建继承自`ConfigurationSection`的配置节类,利用`ConfigurationProperty`特性存储数据,以及通过`ConfigurationManager`进行读写操作。同时,文章讲解了如何在不同节点下写入配置数据,使用`OpenMachineConfiguration()`和`WebConfigurationManager`操作特定配置文件,以及`AppSettings`和`ConnectionStrings`的便捷用法。此外,还探讨了在配置文件中使用自定义类的方法,指出需要定义转换器以实现这一功能。
698

被折叠的 条评论
为什么被折叠?



