配置文件——App.config文件读取和修改
作为普通的xml文件读取的话,首先就要知道怎么寻找文件的路径。我们知道一般配置文件就在跟可执行exe文件在同一目录下,且仅仅在名称后面添加了一个.config 因此,可以用Application.ExecuteablePath+".cofig"的方式来获得,不过更加推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile这句话来直接获取当前程序的配置文件的位置,具体原因,后面再叙述。
现在回过头还是看上面的这个函数,看它的最后一行,它的作用是什么?
查找msdn文档可以发现微软出于性能考虑,对配置文件App.config采用了缓存策略,因此,尽管上面的函数确实在磁盘文件中修改了节点的值,但是,当用前面的那个函数读取的时候,会依然得到原来的那个值,仿佛没有修改一样!所以,必须使用这么句话,进行一遍刷新,强制要求程序下一次读取的时候,从磁盘文件读取!
好了,现在使用Visual Studio写C#程序的童鞋应该都遇到了一个蛋疼的问题,就是在debug时,明明在程序中修改了配置文件,可是下次重新执行程序的时候,发现程序根本没有发生变化,打开与exe文件相对应的config文件查看,发现文件根本没有变化!!!!明明就是当作xml文件来操作的,怎么会这样?!
其实这就涉及VS的运行机制问题了,细心的童鞋会在exe文件的同目录下,发现有一个与之对应的vshost.exe,以及vshost.exe.config 文件,当打开这里的这个config文件后会发现,在这里面的xml文件的值发生了变化!对滴~VS无论在Debug还是Release下,运行的程序都是这个带有vshost的程序,修改的也是这个程序对应的config。当程序刚刚启动的时候,却是读取的原来与exe文件对应的config文件,将这个config文件内容替换原来与vshost.exe对应的config里面内容,这也就是为什么每次重新开程序后恢复原状的原因。由于程序在VS里面调试的时候,运行的程序与直接去bin文件夹运行的程序不一样,所以,更推荐使用AppDomain.CurrentDomain.SetupInformation.ConfigurationFile来获取当前运行程序的配置文件。
用了各种方法 ,还是无法修改App.config的内容,虽然vshost.exe.config 确实修改。但是下一次启动读的还是原来的config,并且还替换了已经修改的vshost.exe.config
最终采取的方案如下:
public class AppConfigHelper
{
public static string GetValueByKey(string key)
{
ConfigurationManager.RefreshSection("appSettings");
return ConfigurationManager.AppSettings[key];
}
public static void ModifyAppSettings(string strKey, string value)
{
//获得配置文件的全路径
var assemblyConfigFile = Assembly.GetEntryAssembly().Location;
var appDomainConfigFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile;
ChangeConfiguration(strKey, value, assemblyConfigFile);
ModifyAppConfig(strKey, value, appDomainConfigFile);
} private static void ModifyAppConfig(string strKey, string value, string configPath)
{
var doc = new XmlDocument();
doc.Load(configPath); //找出名称为“add”的所有元素
var nodes = doc.GetElementsByTagName("add");
for (int i = ; i < nodes.Count; i++)
{
//获得将当前元素的key属性
var xmlAttributeCollection = nodes[i].Attributes;
if (xmlAttributeCollection != null)
{
var att = xmlAttributeCollection["key"];
if (att == null) continue;
//根据元素的第一个属性来判断当前的元素是不是目标元素
if (att.Value != strKey) continue;
//对目标元素中的第二个属性赋值
att = xmlAttributeCollection["value"];
att.Value = value;
}
break;
} //保存上面的修改
doc.Save(configPath);
ConfigurationManager.RefreshSection("appSettings");
} public static void ChangeConfiguration(string key, string value, string path)
{
var config = ConfigurationManager.OpenExeConfiguration(path);
config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");
}
}
虽说 app.config文件 还是无法看到修改,但是程序运行的时候实际调用的两个文件(vshost.exe.config和exe.config )都被修改了,这样每次启动 配置文件里的内容也都是最新的,只不过如果你的程序重新生成的话,两个文件就会被app.config的内容覆盖。仅仅是调式阶段会有一些不方便,但是一旦打包,就能够很好的使用,每次都能修改配置文件内容,并读取到最新的内容。
配置文件——App.config文件读取和修改的更多相关文章
- 配置文件——WebApp.config文件读取和修改
using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using ...
- C# app.config文件配置和修改
很多时候我们需要对系统的.config文件进度读写操作,例如:系统初始化的参数的更改.系统参数的改变都需要更新到配置文件. 首先我们有必要了解一下app.config.exe.config和vshos ...
- C#项目实例中读取并修改App.config文件
C#项目是指一系列独特的.复杂的并相互关联的活动,这些活动有着一个明确的目标或目的,必须在特定的时间.预算.资源限定内,依据规范完成.项目参数包括项目范围.质量.成本.时间.资源. 1. 向C#项目实 ...
- WPF C#之读取并修改App.config文件
原文:WPF C#之读取并修改App.config文件 简单介绍App.config App.config文件一般是存放数据库连接字符串的. 下面来简单介绍一下App.config文件的修改和更新. ...
- winform程序读取和改写配置文件App.config元素的值
winform程序读取和改写配置文件App.config元素的值 2016-05-16 17:49 by newbirth, 2412 阅读, 0 评论, 收藏, 编辑 1 2 3 4 5 6 7 & ...
- 通过读取配置文件App.config来获取数据库连接字符串
有两种方式://通过读取配置文件来获取连接字符串 第一种方式: App.config 文件的格式: <?xml version="1.0" encoding="ut ...
- C#读取配置文件app.config
应用程序配置文件是标准的 XML 文件,XML 标记和属性是区分大小写的.它是可以按需要更改的,开发人员可以使用配置文件来更改设置,而不必重编译应用程序.配置文件的根节点是configuration. ...
- 修改和获取web.config或app.config文件appSettings配置节中的Add里的value属性 函数
1: /// <summary> 2: /// 修改web.config或app.config文件appSettings配置节中的Add里的value属性 3: /// </summ ...
- 如何使用App.config文件,读取字符串?
如何使用App.config文件,读取字符串? .在项目里添加App.config文件,内容如下: <?xml version="1.0" encoding="ut ...
随机推荐
- IOS基础:深入理解Objective-c中@class 和#import的区别
在面向对象objective-C语言中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,可以#import方式引入,通过@class引入: 这两种的方式的区别在于: 1.运用#im ...
- 【习题5-5 UVA-10391】Compound Words
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 枚举每一个串的分割点. 看看左右两个串在不在字符串中即可. [代码] #include <bits/stdc++.h> ...
- [array] leetCode-1-Two Sum-Easy
leetCode-1-Two Sum-Easy descrition Given an array of integers, return indices of the two numbers suc ...
- 12、USB设备驱动程序
linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...
- 线程堆栈大小 pthread_attr_setstacksize 的使用
pthread_create 创建线程时,若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下: # ulimit -s8192# 上述表示为8M:单位为KB. 也可以通过# ulimit -a ...
- php 转义html标签 反转html标签 符号
$a = '<strong>123</strong>'; //假设这是html代码$b = htmlspecialchars($a); //将< ...
- Cannot find module "element-ui/lib/theme-default/index.css"——解决办法
在vuejs中使用element-ui 1.安装 cnpm install style-loader --save-dev cnpm install css-loader --save-dev cnp ...
- 《SPA设计与架构》之JavaScript模块化
原文 简书原文:https://www.jianshu.com/p/d5fc38506bc4 大纲 1.什么是模块? 2.基本的模块模式 3.模块模式概念 4.模块结构 5.揭示模式 6.模块编程的意 ...
- Windows10终端优化方案:Ubuntu子系统+cmder+oh-my-zsh
原问地址:https://zhuanlan.zhihu.com/p/34152045 最近从MacBook换到了种草已久的Surface Book 2,而我的工作环境也自然要从macOS换到Windo ...
- oracle分组取每组第一条数据
oracle分组后取每组第一条数据 '数据格式 分组取第一条的效果 [sql] SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ...