Config配置文件操作

本文详细介绍了配置文件的操作,包括如何创建继承自`ConfigurationSection`的配置节类,利用`ConfigurationProperty`特性存储数据,以及通过`ConfigurationManager`进行读写操作。同时,文章讲解了如何在不同节点下写入配置数据,使用`OpenMachineConfiguration()`和`WebConfigurationManager`操作特定配置文件,以及`AppSettings`和`ConnectionStrings`的便捷用法。此外,还探讨了在配置文件中使用自定义类的方法,指出需要定义转换器以实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.使用说明:

     // 编辑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; 
        }

    }

}
2. 创建配置文件操作对象
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);
}
4. 写配置文件

在写入 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);
5. 删除配置节

删除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 >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值