上一篇博文中,老周所介绍的自行编写的配置类,虽然能够很好地做封装,但它仅允许修改用户级别的配置,所以文件都是保存到用户配置目录下的。可是,许多情况下,我们还是不考虑用户隔离,而是能够直接修改与应用程序同目录的App.config文件。

那么,能不能在代码文件中编辑 app.config 文件呢?当然是可以的。其实,配置文件本质上是个XML文档,所以,你是可以使用普通XML文件的编辑方式来修改的。但.net类库还是提供有于读写配置文件的专用API,使用专用的API,使得生成的配置比较规范。

.net 的配置文件是由N个配置节组成,每个配置节面向不同的功能,比如 startup 可以配置程序所需要的.net 框架版本。为了便于管理,通常,咱们的应用程序设置都会放到 AppSettings 节上,XML节点为 appSettings。每一条配置都比较简单,就是由 key 和 value 组成。

要对配置文件进行操作,你记得要引用 System.Configuration.dll 程序集,因为System程序集只包含一些常规的类型,而专用于读写配置文件的类型都会包装到 System.Configuration 程序集中。这些API既适用于app.config,也适用于web.config文件。

好,上面这几段废话只要你看懂了,那么下面我们就可以开始干活了。放心,很简单的,老周给你分享的东西,向来都是简单且有实用价值的。

首先,老周介绍一下大概的类型使用过程。

——读取 app.config 文件中 appSettings 节中的内容很简单,使用 ConfigurationManager 类,它公开了两个静态属性,别小看它们,有了这两个属性,读取配置会轻松很多。ConnectionStrings:做过数据库连接的话,你肯定很熟悉它的,这个节点下专门存放连接字符串;AppSettings:这个专门访问 appSettings 节点下的内容,表示形式很简洁,就是key - value 对,而且都是字符串类型。

——写入修改会稍稍复杂一点,但也不是难题。

a、ConfigurationManager类有个静态方法 OpenExeConfiguration ,你可以指定exe文件路径,它自动找到匹配的app.config文件,然后打开,返回一个 Configuration 类型的实例。

b、Configuration 类可以对配置文件进行修改,修改完后,可以掉用 Save 方法保存,或调用 SaveAs 方法把配置存到其他文件上。

接下来,老周上一个例子,这个例子运行后,在窗口上可以设置电脑自爆的日期,当窗口关闭时会把这个日期写入配置文件中的appSettings 节点下。如下图所示。

跟你开个玩笑而已,计算机不会真的爆炸。

通常,我们会在窗口加载时读出配置文件中的值,以便在界面上显示用户上一次设置的内容,不然用户会误以为配置丢失。

            var q = ConfigurationManager.AppSettings.AllKeys.AsQueryable();
var r = from c in q where c == BOMB_DATE select c;
if (r.Count() > )
{
string datestr = ConfigurationManager.AppSettings[BOMB_DATE];
picker.SelectedDate = DateTime.Parse(datestr);
}

在读应用配置前,我用 LINQ 语句查询了一下,确认我要访问的设置项是否存在,如果没有要的设置项,那读个鸡毛。设置节的key是用字符串来表示的,BOMB_DATE是我定义的一个常量。

 const string BOMB_DATE = "bombDate";

配置文件中的设置值是以字符串形保存的,而咱们窗口上的控件需要的是 DateTime 类型的实例,所以读出来后记得要 Parse 一下。

接下来,我们再看看如何修改并保存 app.config 文件。

先把日期选择控件中用户选择的日期转为字符串。

            DateTime seldate = picker.SelectedDate ?? DateTime.Today;
string forstr = seldate.ToShortDateString();

然后,还得获取当前程序的exe路径。

string exePath = Environment.GetCommandLineArgs()[];

GetCommandLineArgs 方法返回的字符串数组中,第一个元素就是本程序exe的路径。

调用 ConfigurationManager.OpenExeConfiguration 静态方法打开app.config文件。

            Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);

随后,是重点部分,就是写入设置内容。

            if (config.AppSettings.Settings.AllKeys.Count(s => s == BOMB_DATE) > )
{
// 如果设置项已经存在
// 则直接修改
var kv = config.AppSettings.Settings[BOMB_DATE];
kv.Value = forstr;
}
else
{
// 如果设置项不存在
// 则添加新项
config.AppSettings.Settings.Add(BOMB_DATE, forstr);
}

这里有个很严重的内容,大家一定、必须、特别要注意。得判一下设置项的key是否已存在,因为你如果直接调用 Add 方法添加的话,如果设置项的key已存在,它不是替换整个值,而是会在原来的值后面追加内容。

比如在本例中,要是我写入了 2017/10/1,第一次保存,因为设置项不存在,所以没问题。但是,一旦我把值修改为 2017/11/5,然后再保存,那么设置项的值 就会变为

//,//

也就是说,新保存的内容不会替换,而是追加,然后用逗号分隔每个值。

如此一来,在读取的时候就麻烦了,这样的字符串是不能转化为 DateTime 实例的。

所以,这里要先分析一下,如果设置项已经存在,那就通过索引器得到这个设置项的内容,它用一个 KeyValueConfigurationElement 类封装,其中,Value 属性是可以修改的(Key不能变,所以只读),此时,我们只要直接给 Value 属性赋新的值,那么保存时就会覆盖原有的值,而不会在后面追加了。而如果设置项不存在,那太好办,直接一个Add方法添加就可以了。

最后,修改完了,别忘了保存,不保存的话,是不会写入app.config文件的。

            if (config.AppSettings.SectionInformation.IsLocked)
{
// 如果配置节已锁定,则放弃保存
return;
}
config.Save(ConfigurationSaveMode.Modified);

保存前检测 IsLocked 属性,是看看这个配置节是否被锁定,如果锁了,你是不能保存的。

在配置文件中,你可以用这种方法来让某个节点被锁定。

    <appSettings lockItem="true">
…… </appSettings>

锁定后,节点就不允许别人编辑了。当然了,你手动打开配置文件是可以改的,我说的是在代码中用API不能改。

在调用 Configuration 实例的 Save 方法时,可以向方法传递一个 ConfigurationSaveMode 枚举值,这里我用 Modified,表示只对被修改过的节点进行写入,这样做可以省时省力省开销。

保存后的 app.config 文件的appSettings节点如下。

    <appSettings>
<add key="bombDate" value="2017/7/28" />
</appSettings>

=================================================

以上示例的源代码下载,请点击▶这里◀

怎么样,学了后有用吧。差点忘了说,如果你把exe文件放在如 Program Files 等需要管理员权限的目录中,你必须以管理员身份运行应用程序才能保存配置文件。

【.net 深呼吸】在运行阶段修改应用配置文件的更多相关文章

  1. asp.net中为什么修改了配置文件后我们不需要重启IIS

    本文转载:http://blog.itpub.net/12639172/viewspace-659819/ 大家知道,asp.net中,如果我们修改了配置文件只要把它保存之后,就会立刻反应到程序中, ...

  2. Spark添加/更改集群节点需要修改的配置文件

    笔记:在配置好了spark后,如果需要添加/删除一个结点需要修改如下配置文件 cd $HADOOP/etc/hadoop 进入hadoop配置文件夹下 修改 slaves,将对应的节点添加/删除 修改 ...

  3. sublime text3修改默认配置文件是失败的解决方法

    如果你修改sublime text3的默认配置文件Preferences.sublime-settings失败,现实的错误信息如下图: 其实根据提示信息就好找问题出在哪里了:权限 要想成功的修改默认配 ...

  4. Linux中使用sed命令或awk命令修改常规配置文件

    一.方案: Linux中使用sed命令或awk命令修改常规配置文件 二.步骤: 1.假设有一个a.txt,内容如下: #!/bin/bash aa= bbb= ccc= #ddd= 2.如果想要把里面 ...

  5. AWS中国EC2 公网IP登录免pemKEY修改shh 配置文件

    个人使用记录 1:KEY 授权 chmod 400 VPN.pem 2:连接 ssh -i "VPN.pem" ubuntu@ec2-54-183-119-93.us-west-1 ...

  6. docker下修改mysql配置文件

    原文:docker下修改mysql配置文件 版权声明:本文为博主原创文章,转载注明地址:http://blog.csdn.net/wang704987562 https://blog.csdn.net ...

  7. Golang读取并修改非主流配置文件

    今天工作中碰到的问题,要求修改此配置文件,没看出来是什么格式,用了下面的思路: mysql { # If any of the files below are set, TLS encryption ...

  8. 修改gitlab配置文件指定服务器ip和自定义端口:

    修改gitlab配置文件指定服务器ip和自定义端口: vim /etc/gitlab/gitlab.rb gitlab-ctl reconfiguregitlab-ctl restart 查看与rpm ...

  9. linux下为什么每次修改完配置文件之后都需要重新加载配置文件

    目录 一.关于inode 二.inode的作用 二.为什么每次修改完服务器配置文件之后,都需要重新加载一下配置文件? 一.关于inode 1.在linux下一切皆文件,linux文件由三部分组成:文件 ...

随机推荐

  1. 在.net下打造mongoDb基于官方驱动最新版本

    还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因 ...

  2. Function.prototyoe.call.apply

    刚刚在一个群里看到有人问 Function.prototype.call.apply(obj, args) 如何理解,觉得挺有意思的.刚开始被惯性思维干扰了,一直都是 call 和 apply 分开用 ...

  3. RSA加密通信小结(三)--生成加解密所需的SSL命令与流程

    在iOS中使用RSA加密解密,需要用到.der和.p12后缀格式的文件,其中.der格式的文件存放的是公钥(Public key)用于加密,.p12格式的文件存放的是私钥(Private key)用于 ...

  4. MongoDB一个基于分布式文件存储的数据库(介于关系数据库和非关系数据库之间的数据库)

    1:MongoDB的官方网址:https://www.mongodb.com   MongoDB的中文社区:http://www.mongoing.com/(老外也很看重中国市场啊,知道大家英语不好, ...

  5. 【JavaScript学习】-事件响应,让网页交互

    什么是事件: JavaScript 创建动态页面.事件是可以被 JavaScript 侦测到的行为. 网页中的每个元素都可以产生某些可以触发 JavaScript 函数或程序的事件. 比如说,当用户单 ...

  6. 用Html5/CSS3做Winform,一步一步教你搭建CefSharp开发环境(附JavaScript异步调用C#例子,及全部源代码)上

    本文为鸡毛巾原创,原文地址:http://www.cnblogs.com/jimaojin/p/7077131.html,转载请注明 CefSharp说白了就是Chromium浏览器的嵌入式核心,我们 ...

  7. [原]浅谈vue过渡动画,简单易懂

    在vue中什么是动画 开始先啰嗦一下,动画的解释(自我理解

  8. WebService小记

    这个问题找了好多地方都没有结果,自己暂且总结一下吧,也不算是解决问题的根本途径,但是也不失为一种办法.当时用了wsimport  wsdl2java xfire 都没有解决,大牛能解决的话,欢迎留言. ...

  9. js模块化/js模块加载器/js模块打包器

    之前对这几个概念一直记得很模糊,也无法用自己的语言表达出来,今天看了大神的文章,尝试根据自己的理解总结一下,算是一篇读后感. 大神的文章:http://www.css88.com/archives/7 ...

  10. poj 2739 Sum of Consecutive Prime Numbers 小结

     Description Some positive integers can be represented by a sum of one or more consecutive prime num ...