C# 读取app.Config自定义配置文件
基于WebApi项目整理:
当解决方案包含多个项目,项目又需要各自的配置文件时,为保证整洁,我选择在项目下自定义专属的config文件,如下:
那么问题来了,如何读取不在根目录下的config文件?
最初参考网上的教程,使用这样:
//打开配置文件 var basePath = System.Web.HttpContext.Current.Server.MapPath("~/"); // 获取根目录 System.IO.DirectoryInfo pathInfo = new System.IO.DirectoryInfo(basePath); string path = pathInfo.Parent.FullName + "\\WIPControl.Base\\App.config"; // 获取根目录的上一层及目录,进行自定义指定 // 根据exePath拿到指定的config文件 System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(path);
此方法存在一个问题:读取文件时会在指定的path后自动加上".config",就是说拿到的config文件名需要是:App.config.config,而且App.config也必须存在,否则路径会报错。
在此基础上饰演了将指定Path扣除“.config”,修改为:
string path = pathInfo.Parent.FullName + "\\WIPControl.Base\\App";
会报错:加载配置文件时出错: 参数“exePath”无效。
Orz,好吧,其实App.config.config也不是不能用,只是太丑了,强迫症忍不了!!
于是我去研究了ConfigurationManager.OpenExeConfiguration这个方法——
官方注释是这样的:就是说它需要的参数其实是个XXX.exe,实际读取的文件是XXX.exe.config
不过它有另外一个方法:ConfigurationManager.OpenMappedExeConfiguration——也可以传参指定路径!
最终代码参考:
/// <summary> /// App.Config配置服务 /// </summary> public class ConfigOperate { /// <summary> /// 获取配置项 /// </summary> /// <param name="key">配置文件中key字符串</param> /// <returns></returns> public static string GetValueFromConfig(string key) { try { //打开配置文件 var basePath = System.Web.HttpContext.Current.Server.MapPath("~/"); // 获取根目录 System.IO.DirectoryInfo pathInfo = new System.IO.DirectoryInfo(basePath); string path = pathInfo.Parent.FullName + "\\WIPControl.Base\\App.config"; // 获取根目录的上一层及目录,指定路径 ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = path }; var config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); //获取appsettings的节点 AppSettingsSection appsection = (AppSettingsSection)config.GetSection("appSettings"); return appsection.Settings[key].Value; } catch (Exception ex) { return ex.Message; } } /// <summary> /// 设置配置项 /// </summary> /// <param name="key">配置文件中key字符串</param> /// <param name="value">配置文件中value字符串</param> /// <returns></returns> public static bool SetKeyValueToConfig(string key, string value) { try { Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); AppSettingsSection appsection = (AppSettingsSection)config.GetSection("appsettings"); // 设置key-value appsection.Settings[key].Value = value; config.Save(); return true; } catch { return false; } } }
PS:根据路径获取上级目录
// 方法1 DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}..\..\", Application.StartupPath)); String path = di.FullName; //..\有几个就是回退几层
// 方法2 DirectoryInfo info = new DirectoryInfo(Application.StartupPath); String path = info.Parent.Parent.FullName;
// 方法3 string WantedPath = Application.StartupPath.Substring(0,Application.StartupPath.LastIndexOf(@"\"));