通过C#程序操作Config文件

 更新时间:2022年02月26日 09:43:27   作者:.NET开发菜鸟  
这篇文章介绍了通过C#程序操作Config文件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

对于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文件里面的值,更改只是发生在内存中。

到此这篇关于通过C#程序操作Config文件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • python实现AutoResetEvent类的阻塞模式方法解析

    python实现AutoResetEvent类的阻塞模式方法解析

    AutoResetEvent :当某个线程执行到WaitOne()方法时,该线程则会处于阻塞模式,当被调用了Set()方法,阻塞的线程则会继续向下执行,其状态立即被自动设置为阻塞模式
    2012-11-11
  • C#检查远程或本地磁盘使用率

    C#检查远程或本地磁盘使用率

    要检查磁盘的使用情况确定程序放哪个服务器和清理垃圾,所以写个小程序帮忙检查。本文给大家介绍C#检查远程或本地磁盘使用率的相关知识,感兴趣的朋友一起学习吧
    2016-04-04
  • C#排序算法之堆排序

    C#排序算法之堆排序

    这篇文章主要为大家详细介绍了C#排序算法之堆排序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • C#多线程的相关操作讲解

    C#多线程的相关操作讲解

    本文详细讲解了C#多线程的相关操作,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • C# 泛型集合类List<T>使用总结

    C# 泛型集合类List<T>使用总结

    本文主要主要介绍了C# 泛型集合类List<T>使用总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-05-05
  • C#结合JavaScript实现上传视频到腾讯云点播平台的操作方法

    C#结合JavaScript实现上传视频到腾讯云点播平台的操作方法

    这篇文章主要介绍了C#结合JavaScript实现上传视频到腾讯云点播平台,上传视频功能,主要要解决两个问题,一是在服务端通过C#生成签名和SDKID,二是在客户端通过JavaScript上传视频到腾讯云点播服务器,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • 深入了解c# 迭代器和列举器

    深入了解c# 迭代器和列举器

    这篇文章主要介绍了c# 迭代器和列举器的相关资料,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下
    2020-08-08
  • 详解C#中的Async和Await用法

    详解C#中的Async和Await用法

    这篇文章主要介绍了C#中的Async和Await用法,包括在C#5.0下一些新特性的影响,需要的朋友可以参考下
    2015-07-07
  • WPF开发技巧之花式控件功能扩展详解

    WPF开发技巧之花式控件功能扩展详解

    这篇文章主要给大家介绍了关于WPF日常开发之花式控件功能扩展的相关资料,通过文中这个例子,我们可以对WPF的掌握会更深刻,需要的朋友可以参考下
    2021-07-07
  • C#实现Xml序列化与反序列化的方法

    C#实现Xml序列化与反序列化的方法

    这篇文章主要介绍了C#实现Xml序列化与反序列化的方法,将序列化与反序列化的方法封装入一个类文件中,包含了较为详尽的注释说明,非常具有实用价值,需要的朋友可以参考下
    2014-12-12

最新评论