读写配置文件

.net Framework 2.0 专门提供了 配置文件的操作。

namespace System. Configuration;


1. 创建配置节类

必须创建继承自 ConfigurationSection的对象才能进行配置数据读写操作, ConfigurationSection提供了索引器用来获取和设置配置数据,需要注意的是拥有 ConfigurationProperty特性的属性才会被存储,并且名称要保持大小写完全一致,如下面的代码中,所有的"id"必须保持一样。
class  ConfigSectionData : ConfigurationSection
{
    [ConfigurationProperty(
"id")]
    
public int Id
    
{
        
get return (intthis["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);

下面就是生成的 配置文件
<? xml version="1.0" encoding="utf-8" ?>
< configuration >
  
< configSections >
    
< sectionGroup  name ="group1"  type ="System.Configuration.ConfigurationSectionGroup,  >
      <section name="
add" type ="ConsoleApplication1.ConfigSectionData,  />
    </sectionGroup>
  </configSections>
  <group1>
    <add id="
1000" time ="02/18/2006 22:01:02"   />
  
</ group1 >
</ configuration >

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. 使用自定义类 

2006-4-17 补充,回复 ggy 网友的疑问。
引用至 ggy
比如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 (intthis["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 >

更详细的信息可以看 MSDN 中关于 System.Configuration.ConfigurationConverterBase 的说明。

你可能感兴趣的:(配置文件)