当前位置: 首页 > news >正文

C# 读取层次化ini配置文件

ConnectionStrings:DefaultConnection=DataSource=app.db;Cache=Shared
Logging:LogLevel:Default=Information
Logging:LogLevel:Microsoft=Warning
Logging:LogLevel:Microsoft.Hosting.Lifetime=Information
AllowedHosts=*
using System;
using System.Collections.Generic;
using System.IO;public class HierarchicalConfig
{// 使用不区分大小写的字典存储键值对private readonly Dictionary<string, string> _values = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);/// <summary>/// 从文件加载配置/// </summary>/// <param name="filePath">配置文件路径</param>/// <param name="encoding">文件编码,默认 UTF-8</param>public HierarchicalConfig(string filePath, Encoding encoding = null){if (encoding == null) encoding = Encoding.UTF8;Load(filePath, encoding);}private void Load(string filePath, Encoding encoding){if (!File.Exists(filePath))throw new FileNotFoundException("配置文件不存在", filePath);foreach (string line in File.ReadAllLines(filePath, encoding)){string trimmed = line.Trim();// 忽略空行和注释(支持 # 和 ; 开头的注释)if (string.IsNullOrEmpty(trimmed) || trimmed.StartsWith("#") || trimmed.StartsWith(";"))continue;int equalIndex = trimmed.IndexOf('=');if (equalIndex <= 0) // 没有等号或等号在开头(无效)continue;string key = trimmed.Substring(0, equalIndex).TrimEnd();  // 键,保留原始大小写string value = trimmed.Substring(equalIndex + 1).TrimStart();// 可选:去除值两端的引号(如果值用引号包围)if (value.Length >= 2){if ((value[0] == '"' && value[^1] == '"') || (value[0] == '\'' && value[^1] == '\''))value = value.Substring(1, value.Length - 2);}// 存储完整键路径(保留冒号分隔符)_values[key] = value;}}/// <summary>/// 获取指定键的值/// </summary>/// <param name="keyPath">键路径,如 "Logging:LogLevel:Default"</param>/// <param name="defaultValue">键不存在时返回的默认值</param>public string GetValue(string keyPath, string defaultValue = null){return _values.TryGetValue(keyPath, out string value) ? value : defaultValue;}/// <summary>/// 判断指定键是否存在/// </summary>/// <param name="keyPath">键路径,如 "ConnectionStrings:DefaultConnection"</param>public bool ContainsKey(string keyPath){return _values.ContainsKey(keyPath);}/// <summary>/// 获取所有以某前缀开头的键值对(可用于模拟“节”)/// </summary>/// <param name="prefix">前缀,如 "Logging:"</param>public IEnumerable<KeyValuePair<string, string>> GetValuesWithPrefix(string prefix){foreach (var kv in _values){if (kv.Key.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))yield return kv;}}
}
http://www.jsqmd.com/news/434929/

相关文章:

  • 远程办公总卡顿?云桌面让高效办公不打烊
  • 药厂行业工业秤选型:符合GMP要求的品牌与厂家(2026.3) - 品牌推荐大师
  • 2026年3月电推杆电动推杆厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • vue项目中刷新(F5)会重置Vuex state,配置持久化state
  • 2026年不锈钢立柱厂家推荐排行榜:304拉丝护栏、定制圆管扶手、异形焊接喷涂及玻璃栏杆配套,精选耐用工艺与创新设计品牌 - 品牌企业推荐师(官方)
  • VIRTIO_GPU前端
  • 大润发购物卡回收避坑全攻略:正规渠道 + 保姆级步骤,零踩坑变现 - 团团收购物卡回收
  • 博物馆设计优质供应商费用怎么算,上海华致收费合理吗? - 工业设备
  • 2026年3月常开式气动离合器厂家推荐榜,甄选企业实测解析 - 品牌鉴赏师
  • 探寻2026厌氧颗粒污泥优选厂,口碑厂家大揭秘,行业内排行前列的厌氧颗粒污泥排行综合实力与口碑权威评选 - 品牌推荐师
  • 探讨博物馆设计服务商价格,上海市场大概多少钱 - 工业品网
  • 2026年3月精密五金机械加工厂家推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 2026年3月空气离合器摩擦片厂家推荐,高性能与可靠性兼具优质品牌 - 品牌鉴赏师
  • 预算有限如何选工业铝材?2026年十家高性价比品牌实测评价 - 速递信息
  • 闲置瑞祥商联卡别躺尸!亲测靠谱回收方式,再也不踩坑 - 团团收购物卡回收
  • 2026陕西玻璃钢/泡沫/不锈钢/景观雕塑厂家五大推荐:多元材质驱动下的景观艺术新势力 - 深度智识库
  • 定稿前必看!降AIGC软件 千笔·降AIGC助手 VS WPS AI 专科生专属推荐
  • 数据邪修大法好:仅用文本数据就能预训练多模态大模型
  • 2026最新洁净风管品牌推荐!国内优质洁净风管权威榜单发布 - 十大品牌榜
  • 分析2026年PKE低频天线生产厂家,明宇星口碑排名怎么样? - mypinpai
  • 省心了! 降AI率软件 千笔·专业降AIGC智能体 VS 文途AI,专科生专属神器
  • 一篇搞定全流程,一键生成论文工具,千笔 VS 笔捷Ai
  • 2026年知名的塑料托盘 品牌推荐:网格塑料托盘厂家精选 - 品牌宣传支持者
  • 2026年 幕墙精致钢厂家推荐排行榜:异形/镀锌/Q345/隐框/钢板拼接/直出/富锌底漆/T型/氟碳喷涂,精选优质工艺与定制化解决方案 - 品牌企业推荐师(官方)
  • 【2026实测】RVC变声器下载安装保姆级教程(附安装包+图文详解) - sdfsafafa
  • antv3 x6 基本语法-动态节点添加 data数据(六)
  • 2026必备!AI论文网站 千笔ai写作 VS 学术猹 专科生首选
  • 2026年3月医用净化空调机组公司推荐,精准检测与稳定性能深度解析 - 品牌鉴赏师
  • 灾难模拟技术让建筑结构更安全
  • 2026年 模切机厂家推荐排行榜,印后模切机,高精度模切机,小型模切机,高效智能模切设备源头企业深度解析 - 品牌企业推荐师(官方)