C#下.NET配置文件的使用(1)
原文链接:https://blog.csdn.net/dbzhang800/article/details/7212420
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);
}
C#下.NET配置文件的使用(1)的更多相关文章
- 使用T4模板生成不同部署环境下的配置文件
在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据目标环境不同而不同.比如在开发环境中,数据 ...
- SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件
路径说明: 一.加载类目录下的配置文件 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:ap ...
- 直接修改workspace下的配置文件与tomcat下的文件
项目中直接修改workspace下的配置文件与tomcat下的文件,可是还有错误,例如修改了4个配置文件中的一个配置文件.经查如下: 直接修改workspace下的配置文件与tomcat下的文件,可能 ...
- T4模板生成不同部署环境下的配置文件
使用T4模板生成不同部署环境下的配置文件 在开发企业级应用的时候,通常会有不同的开发环境,比如有开发环境,测试环境,正式环境,生产环境等.在一份代码部署到不同环境的时候,不同环境的配置文件可能需要根据 ...
- Linux 下 Vi 配置文件 .vimrc 文件
Linux 下 Vi 配置文件 .vimrc 文件 配置 vim 的方法是在用户主目录下建立个.vimrc文件,我一般使用root帐户,所以就在/root/下建立一个.vimrc文件:vi /root ...
- java读取resource目录下的配置文件
java读取resource目录下的配置文件 1:配置resource目录 下的文件 host: 127.0.0.1 port: 9300 2:读取 / 代表resource目录 InputSt ...
- Java读取Maven工程下的配置文件,工具类
Java开发中,经常需要在maven工程中读取src/main/resources下的配置文件: 思路如下: Class.getClassLoader() 返回类加载器ClassLoader,进而可以 ...
- m_Orchestrate learning system---二十九、什么情况下用数据库做配置字段,什么情况下用配置文件做配置
m_Orchestrate learning system---二十九.什么情况下用数据库做配置字段,什么情况下用配置文件做配置 一.总结 一句话总结: 配置文件 开发人员 重置 数据库 非开发人员 ...
- Python获取当前路径下的配置文件
Python获取当前路径下的配置文件 有的时候想读取当前目录下的一个配置文件.其采用的办法是: import os # 获取当前路径 curr_dir = os.path.dirname(os.pat ...
- Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新
Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...
随机推荐
- Mybatis【9】-- Mybatis占位符#{}和拼接符${}有什么区别?
代码直接放在Github仓库[https://github.com/Damaer/Mybatis-Learning ],可直接运行,就不占篇幅了. 目录 1.#{}占位符 2.${}拼接符 3.#{} ...
- go mod使用小结
转载请注明出处: go mod 命令是用于管理 Go 语言项目的模块依赖关系的工具.Go 语言从 1.11 版本开始引入了模块支持,并在后续版本中逐渐完善.模块是 Go 语言代码的一个集合,每个模块都 ...
- 3D饼图
1.实现思路 Echarts本身没有这类图形,可以使用其扩展echarts-gl进行绘制,echarts-gl曲面图可以完成这类需求 <script src="https://cdn. ...
- 记一次 .NET某差旅系统 CPU爆高分析
一:背景 1. 讲故事 前些天训练营里的一位学员找到我,说他们的差旅后台系统出现了CPU爆高的情况,爆高之后就下不去了,自己分析了下也没找到原因,事情比较紧急,让我帮忙看下是什么回事,手里也有dump ...
- window下cmd显示乱码
前情 最近在维护一些老项目,本地开发环境跑不起来,需要根据cmd中的报错来解决一些环境问题 坑位 在解决环境错误的时候,cmd命令行日志打印出来的是一堆乱码,导致看不清具体是什么错误 Why? cmd ...
- QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析
QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析 CVE-2021-3947 信息泄露漏洞 漏洞分析 漏洞点是 nvme_changed_nslist stati ...
- 你真的懂System.out.println()吗?
简介 众所周知,Java语言是面向对象的,那如果让你用一行代码体现出来呢? 如果你能自己读懂System.out.println(),就真正了解了Java面向对象编程的含义. 面向对象编程即创建了对象 ...
- Envoy 官网,中文指南,Envoy 实现 .NET 架构网关
收集一些 Envoy 的资料 Envoy 实现 .NET 架构的网关系列 Envoy实现.NET架构的网关(一)静态配置与文件动态配置 Envoy实现.NET架构的网关(二)基于控制平面的动态配置 E ...
- 【Linux】【专项突破】CentOS下软件安装
目录 rpm yum软件仓库 配置文件 缓存处理 清理缓存 重构缓存 查询包的依赖关系 rpm # 普通下载安装 rpm -ivh 包名 # 更新 rpm -Uvh 包全名 # 查询 rpm -q 包 ...
- 【XML编程与WEB服务】XML入门
目录 XML -入门 XML文档组成 XML文档规则 XML元素 特殊字符数据引用 CDATA段 空白处理 XML -入门 XML(Extensible Markup Language):可扩展的标记 ...