通过C#程序操作Config文件
作者:.NET开发菜鸟 发布时间:2023-11-30 14:24:06
对于config文件,一般情况下都是使用ConfigurationManager加载,然后通过读取相应节点的值来获取想要的数据,但是,有时候需要修改config文件的值,这时候就用到了OpenExeConfiguration()方法。
MSDN上面对该方法的解释:ConfigurationManager.OpenExeConfiguration方法用来把指定的客户端配置文件作为Configuration对象打开,该方法具有两个重载:
名称 | 说明 |
ConfigurationManager.OpenExeConfiguration (ConfigurationUserLevel) | 将当前应用程序的配置文件作为 Configuration 对象打开。 |
ConfigurationManager.OpenExeConfiguration (String) | 将指定的客户端配置文件作为 Configuration 对象打开。 |
一、使用OpenExeConfiguration(ConfigurationUserLevel)重载设置当前应用程序的配置文件
客户端应用程序使用应用于所有用户的全局配置、应用于单个用户的单独配置以及应用于漫游用户的配置。userLevel 参数通过指示该配置文件是不具有用户级别(配置文件与应用程序位于同一目录中),还是具有一个依每个用户而定的用户级别(配置文件位于用户级别所确定的应用程序设置路径中),从而确定所打开的配置文件的位置。
通过向 userLevel 传递下列值之一来指定要获取的配置:
若要获取应用于所有用户的 Configuration 对象,请将 userLevel 设置为 None。
若要获取应用于当前用户的本地 Configuration 对象,请将 userLevel 设置为 PerUserRoamingAndLocal。
若要获取应用于当前用户的漫游 Configuration 对象,请将 userLevel 设置为 PerUserRoaming。
注意:若要获取资源的 Configuration 对象,您的代码必须对它从中继承设置的所有配置文件具有“读取”特权。若要更新配置文件,您的代码还必须对该配置文件及其所在目录具有“写入”特权。
示例程序:
1、配置文件结构如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="ApServer1" value="ApServer1"/>
<add key="ApServer2" value="ApServer2"/>
<add key="LocalHost1" value="LocalHost1"/>
<add key="LocalHost2" value="LocalHost2"/>
<add key="addr" value="11111"/>
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
2、通过程序修改LocalHost1节点的值
string strLocalHost1Value1 = ConfigurationManager.AppSettings["LocalHost1"].ToString(); //strLocalHost1Value1="LocalHost1";
//Configuration对象
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["LocalHost1"].Value = "http://127.0.0.1";
//保存配置文件
config.AppSettings.SectionInformation.ForceSave = true;
config.Save(ConfigurationSaveMode.Modified);
//重新加载改变的节点
ConfigurationManager.RefreshSection("appSettings");
//读取配置文件的值
string strLocalHost1Value2 = ConfigurationManager.AppSettings["LocalHost1"].ToString();//strLocalHost1Value2="http://127.0.0.1"
二、使用OpenExeConfiguration(String)重载设置指定的客户端配置文件
重载指定的客户端config文件主要包括下面3种情况:
1、加载非当前应用程序yyy.exe默认的config文件的xxx.exe.config文件(yyy.exe是当前应用程序,xxx.exe.config与yyy.exe.config文件不在同一目录下)。
2、加载非应用程序的xxx.config文件。
3、让类库xxx.dll内的函数读取默认config文件的时候,读取的是xxx.dll同级目录下的xxx.dll.config文件,而不是加载xxx.dll的应用程序yyy.exe的默认应用程序配置文件:yyy.exe.config。
注意:在类库中使用ConfigruationManager读取的不是自动编译生成的xxx.dll.config文件,而是引用类库的应用程序yyy.exe的yyy.exe.config文件。
解决方法:
按照MSDN上的说明,我们把要打开的xxx.exe.config的路径作为参数传入,代码如下:
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe.config");
con.AppSettings.Settings["LocalHost2"].Value = "测试";
但是程序运行的时候报错,经过调试,发现con对象的FilePath属性的值为:C:\Modify.exe.config.config,程序自己在传入的参数后增加了“.config”作为要打开的config文件的路径,因为没有这个文件,所以程序报错。这里要传入的参数,不应该是要打开的config文件的路径,而是这个config文件对应的应用程序的路径,上面的代码应修改为:
//参数传的是应用程序的路径
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe.");
con.AppSettings.Settings["LocalHost2"].Value = "测试";
再次运行程序,还是报错,提示“加载配置文件时出错:参数exePath”无效。这里要传入应用程序的路径(exePath)没错,但是因为在xxx.exe.config文件的同一目录下,没有xxx.exe文件,因此我们传入的exePath实际上是无效的,为了能够加载xxx.exe.config文件,需要在同一目录下增加一个xxx.exe文件。(可以在同一目录下新建一个txt文件,修改名称为xxx,扩展名为.exe,这样就可以加载xxx.exe.config配置文件了)
完整的代码如下:
//参数传的是应用程序的路径
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify.exe");
con.AppSettings.Settings["LocalHost2"].Value = "测试";
//保存配置文件
con.AppSettings.SectionInformation.ForceSave = true;
con.Save(ConfigurationSaveMode.Modified);
//重新加载改变的节点
ConfigurationManager.RefreshSection("appSettings");
//读取修改后的配置文件节点值
string str = con.AppSettings.Settings["LocalHost2"].Value;//str="测试"
注意:
使用ConfigurationManager.OpenExeConfiguration(string exePath)即可,同时注意2个小细节:
A:改方法需传入的是exePath,而不是configPath;
B:exePath必须是有效的,因此xxx.exe和xxx.exe.config应该成对出现,缺一不可。
加载非应用程序的xxx.config文件
在上面的例子中,观察xxx.exe.config文件的名称,发现,若把xxx.exe看成YYY,则xxx.exe.config=YYY.config,也就是说:xxx.exe.config是xxx.config文件的一种特殊形式,所以,可以使用如下的代码加载xx.config文件:
//参数传的是应用程序的路径
Configuration con = ConfigurationManager.OpenExeConfiguration("C:\\Modify");
con.AppSettings.Settings["LocalHost2"].Value = "测试";
//保存配置文件
con.AppSettings.SectionInformation.ForceSave = true;
con.Save(ConfigurationSaveMode.Modified);
//重新加载改变的节点
ConfigurationManager.RefreshSection("appSettings");
//读取修改后的配置文件节点值
string str = con.AppSettings.Settings["LocalHost2"].Value;//str="测试"
注意:C:\Modify这个文件必须要有。
加载xxx.dll.config文件:
还是从文件名上来找思路,我们要加载xxx.dll.config文件,可以和加载xxx.config文件一样。在dll内,碰到需要读取config文件信息的时候,放弃使用ConfigurationManager读取节点的值,而是使用OpenExeConfiguration(string exePath)方法加载config文件为一个Configuration对象来使用。
注意:通过程序修改配置文件中节点的值,不会修改.config文件里面的值,更改只是发生在内存中。
来源:https://www.cnblogs.com/dotnet261010/p/6597177.html


猜你喜欢
- mport java.text.DecimalFormat; DecimalFormat &nb
- 在javaweb中写了一个图片的链接,可以打开预览,另外提供一个下载功能。以下是预览代码,没什么好说的;href若连接的是一个压缩包文件之类
- 据JDK5的新特性,用For循环Map,例如循环Map的Keyfor(String dataKey : paraMap.keySet())&
- 引言垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要
- fopen(打开文件)相关函数 open,fclose表头文件 #include<stdio.h>定义函数 FILE * fop
- 开发过程中会遇见很多app注册时,需要通过手机发送验证码验证 ,这是可以封装一个验证码按钮:attrs.xml<?xml versio
- 本文实例为大家分享了java实现五子棋程序的具体代码,供大家参考,具体内容如下知识点1、Swing 编程2、ImageIO 类的使用3、图片
- 本文实例为大家分享了java统计文件中字符个数的具体代码,供大家参考,具体内容如下package com.zhu.io;import jav
- 1、普通用户与系统管理员用户的权限要有严格的区分。如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许
- 一. 假设需求场景在我们开发的过程中,经常出现两个对象存在一对多或多对一的关系。如何在程序在表明这两个对象的关系,以及如何利用这种关系优雅地
- 一、添加pom.xml依赖<parent> <groupId>org.springfram
- 前言想象一下生活中哪些是和线程沾边的?饭店炒菜就是一个很好的例子首先客人要吃菜,前提是厨师要炒好,也就是说,厨师不炒好的话客人是没有饭菜的。
- Spring Security 基本介绍这里就不对Spring Security进行过多的介绍了,具体的可以参考官方文档我就只说下Sprin
- 本文实例为大家分享了Android刮刮卡效果,供大家参考,具体内容如下android实现底层一张图片,上层一个遮罩层,触摸滑动按手指滑动路径
- LinkedList与ArrayList都是List接口的具体实现类。LinkedList与ArrayList在功能上也是大体一致,但是因为
- 介绍:kaptcha 是谷歌开源的非常实用的验证码生成工具一、导入jar包<!-- kaptcha验证码 --><depe
- Zuul作为网关服务,是其他各服务对外中转站,通过Zuul进行请求转发。这就涉及到部分数据是不能原封返回的,比如服务之间通信的凭证,用户的加
- APP中可能会遇到一种需求,就是将当前所在位置的坐标传到服务器上,今天我提供三种途径去获取经纬度坐标信息,第一种是通过Android API
- 一,在一个公共类里创建一个公共方法,然后需要验证的页面都调用这个方法 //在此例子中,就是在入口函数里调用CheckLogin()
- 在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”、“invisible”、“gon