一步一步来,看看.net下的的 Configuration 或者说 Settings
走马观花
System.Configuration 命名空间中的东西是为读写应用程序的配置数据服务的。
在Windows早期,程序使用 .ini 作为配置文件,后来开始鼓励大家使用注册表,到了.NET中,又回归到使用文件,只不过这次默认是xml格式的文件。
用例子说话:
| 例子 | |
| 一 | 读程序program.exe默认配置文件 program.exe.config 中的 "appSettings" 段 |
| 二 | 读写program.exe.config 中的 "appSettings" 段 |
| 三 | 读写program.exe.config 中的自定义字段 "QtSection" |
| 四 | 读写roaming 文件中的自定义字段"QtSection" |
| 五 | 读写任意位置的配置文件? |
例子一
- 配置文件 program.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="first name" value="Debao" />
<add key="last name" value="Zhang" />
</appSettings>
</configuration>
- 程序源码 program.cs
using System.Configuration;
namespace DbZhang800
{
public class TestSettings
{
public static void Main()
{
foreach (string key in ConfigurationManager.AppSettings)
{
string val = ConfigurationManager.AppSettings[key];
Console.WriteLine("{0}: {1}", key, val);
}
}
}
}
编译运行,结果如下:
E:\> csc program.cs E:\> program.exe first name: Debao last name: Zhang
通过ConfigurationManager.AppSettings我们可以很方便地读取默认配置文件中的 appSettings 段。
例子二
前面是只读的,如果需要写入怎么办?
Configuration appConf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
appConf.AppSettings.Settings.Add("Qt", "Quick");
appConf.Save();
编译运行(注,这是运行3次后的结果,每次都给Qt这个key增加了一项):
E:\> csc program.cs E:\> program.exe first name: Debao last name: Zhang Qt: Quick,Quick,Quick
此时的配置文件 program.exe.config 内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="first name" value="Debao" />
<add key="last name" value="Zhang" />
<add key="Qt" value="Quick,Quick,Quick" />
</appSettings>
</configuration>
例子三
看看读写自定义字段的情况。不操作appSettings,操作一个自定义的QtSection段
- program.cs
-
首先创建一个ConfigurationSection的派生类
- 然后打开一个配置文件,通过该派生类进行操作
-
using System;
using System.Configuration;
namespace DbZhang800
{
public sealed class QtSection : ConfigurationSection
{
[ConfigurationProperty("version", DefaultValue="4.4.0")]
public string Version
{
get
{
return (string)this["version"];
}
set
{
this["version"] = value;
}
}
}
public class TestSettings
{
public static void Main()
{
Configuration appConf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
QtSection qtsection;
if ((qtsection = (QtSection)appConf.Sections["QtSection"]) == null)
{
qtsection = new QtSection();
//qtsection.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToLocalUser;
appConf.Sections.Add("QtSection", qtsection);
}
Console.WriteLine("Current: {0}", qtsection.Version);
qtsection.Version = "5.0.0";
appConf.Save(ConfigurationSaveMode.Full);
}
}
}
运行后,生成的配置文件如下:
- program.exe.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="QtSection" type="DbZhang800.QtSection, Program, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" allowLocation="true" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" overrideModeDefault="Allow" restartOnExternalChanges="true" requirePermission="true" />
</configSections>
<QtSection version="5.0.0" />
</configuration>
注意:它在configSections自动添加了我们自定义段的一些信息。
例子四
前面的配置文件和应用程序在同一个目录下,如果不同用户需要不同的配置文件怎么办呢?
前面的例子中,OpenExeConfiguration使用的参数是 None,该参数指定不同的级别
| None | 只使用程序默认配置文件 |
| PerUserRoaming | 也要使用用户 roam 文件 |
| PerUserRoamingAndLocal | 也要使用用户local 文件 |
在前一个例子基础上,我们把 None 改为 PerUserRoaming看看,结果... 运行时:
E:\TestSettings>program.exe Current: 5.0.0 未处理的异常: System.Configuration.ConfigurationErrorsException: 执行 !QtSection 的配置节处理程序时出错。 ---> System.InvalidOperationException: 不能编辑已锁定的 ConfigurationSection 属性。 ...
报出异常,无法将其写入到roaming文件,原因何在呢?
-
就在于我们在xml文件看到的那个MachineToApplication属性,该段只能写入到machine和appplication级别的配置文件,无法写入用户配置文件。
我们需要在生成这个段的时候就添加一个 MachineToRoamingUser 属性
public static void Main()
{
Configuration appConf = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoaming);
QtSection qtsection;
if ((qtsection = (QtSection)appConf.Sections["QtSection"]) == null)
{
qtsection = new QtSection();
qtsection.SectionInformation.AllowExeDefinition = ConfigurationAllowExeDefinition.MachineToRoamingUser;
appConf.Sections.Add("QtSection", qtsection);
}
Console.WriteLine("Current: {0}", qtsection.Version);
qtsection.Version = "5.0.0";
Console.WriteLine(appConf.FilePath);
appConf.Save(ConfigurationSaveMode.Full);
}
这样,配置可以正常写入
C:\Users\dbzhang\AppData\Roaming\DbZhang800\Program.exe_Url_foycvmvcbx4tf51hrft53z11fmpo2kto\0.0.0.0\user.config
打开其他的配置文件:
-
ConfigurationManager.OpenExeConfiguration(string)
- 这个东西,string 指定 exe 的路径(但不限于,该路径后会被自动添加一个 .config)
-
ConfigurationManager..::.OpenMachineConfiguration()
- 位于%windir%\Microsoft.NET\Framework\version\config
例子五
操作其他的配置文件
比如,我要操作当前工作目录下的 abcd.config 这个文件,那么需要使用 OpenMappedExcConfiguration:
public static void Main()
{
string path = System.IO.Path.Combine(Environment.CurrentDirectory, "abcd.config");
ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
configFile.ExeConfigFilename = path;
Configuration appConf = ConfigurationManager.OpenMappedExeConfiguration(configFile, ConfigurationUserLevel.None);
QtSection qtsection;
if ((qtsection = (QtSection)appConf.Sections["QtSection"]) == null)
{
qtsection = new QtSection();
appConf.Sections.Add("QtSection", qtsection);
}
Console.WriteLine("Current: {0}", qtsection.Version);
qtsection.Version = "5.0.0";
appConf.Save(ConfigurationSaveMode.Full);
}
本文详细介绍了.NET框架中Configuration命名空间的使用,包括如何读取和写入默认配置文件、自定义字段以及不同用户配置文件的管理。通过具体例子展示了如何操作appSettings段、自定义字段和在不同配置级别下的文件保存。
2899

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



