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(@"\"));

 

posted @ 2022-07-20 11:46  暴躁老砚  阅读(885)  评论(0编辑  收藏  举报