1.增加备注项写入

例:

#节点备注
[A]
#项备注
bbb=1
ccc=2

[B]
bbb=1

 IniConfig2 ic = new IniConfig2();

//首次写入

            if (!ic.CanRead())
            {
                ic.AddSectionReMarke("A", "节点备注");
                ic.SetValue("A", "bbb", "1" );
                ic.SetValue("A", "ccc", "2");
                ic.SetValue("A", "ccc", "2");
                ic.SetValue("B", "bbb", "1");
                ic.AddItemReMarke("A","bbb", "项备注");
            }

//获取值

        string a = ic.GetValue("A", "bbb");

    /// <summary>/// 配置文件读写类,支持中文和注释保留/// 增加备注/// </summary>public class IniConfig2{//小结private class Section{public Section(){items = new List<ValueItem>();reMark = new List<string>();}public string name;//名称public List<ValueItem> items;//子项public List<string> reMark;//备注}//项目private class ValueItem{public ValueItem(){reMark = new List<string>();}public string key;//键public string value;//值public List<string> reMark;//备注}private const string DefaultFileName = "Config.ini";//默认文件private readonly string filePath;public IniConfig2() : this(DefaultFileName){}public IniConfig2(string _fileName){if (string.IsNullOrWhiteSpace(_fileName)){_fileName = DefaultFileName;}_fileName = _fileName.EndsWith(".ini", StringComparison.OrdinalIgnoreCase) ? _fileName : $"{_fileName}.ini";filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, _fileName);Load();}public bool CanRead(){return File.Exists(filePath);}List<Section> lst_Section;private void Load(){lst_Section = new List<Section>();List<string> fileComments = new List<string>();fileComments.Clear();if (!File.Exists(filePath)){return;}using (StreamReader reader = new StreamReader(filePath, Encoding.UTF8)){string _txt, _preSectio = "", _preKey = "";List<string> lst_reMarke = new List<string>();Section sec = null;while ((_txt = reader.ReadLine()) != null){_txt = _txt.Trim();if (_txt == ""){continue;}if (_txt.StartsWith("#") || _txt.StartsWith(";")){// 收集注释行lst_reMarke.Add(_txt);}else if (_txt.StartsWith("[") && _txt.EndsWith("]")){if (sec != null){lst_Section.Add(sec);}sec = new Section();//节名称_preSectio = _txt.Substring(1, _txt.Length - 2).Trim();sec.name = _preSectio;// 保存小结前的注释if (lst_reMarke.Count > 0){sec.reMark = lst_reMarke.ToList();lst_reMarke.Clear();}}else{// 键=值int index = _txt.IndexOf('=');if (index > 0 && _preSectio != ""){string key = _txt.Substring(0, index).Trim();string value = _txt.Substring(index + 1).Trim();_preKey = key;ValueItem content = new ValueItem();content.key = _preKey;content.value = value;sec.items.Add(content);}else{ValueItem ct = sec.items.FirstOrDefault(p => p.key == _preKey);if (ct != null){ct.value += Environment.NewLine + _txt;}}// 保存项注释if (lst_reMarke.Count > 0){ValueItem ct = sec.items.FirstOrDefault(p => p.key == _preKey);if (ct != null){ct.reMark = lst_reMarke.ToList();lst_reMarke.Clear();}}}}//数据读取完后,追加到lstif (sec != null){lst_Section.Add(sec);}}}public string GetValue(string section, string key){ValueItem ct = lst_Section.FirstOrDefault(p => p.name == section)?.items.FirstOrDefault(p => p.key == key);if (ct != null){return ct.value.Replace(Environment.NewLine, "");}else{return "";}}public void SetValue(string section, string key, string value){Section nt = lst_Section.FirstOrDefault(p => p.name == section);if (nt != null){ValueItem ct = nt.items.FirstOrDefault(p => p.key == key);if (ct != null){ct.value = value;}else{ct = new ValueItem();ct.key = key;ct.value = value;nt.items.Add(ct);}}else{nt = new Section();nt.name = section;ValueItem ct = new ValueItem();ct.key = key;ct.value = value;nt.items.Add(ct);lst_Section.Add(nt);}Save();}public void AddSectionReMarke(string section, string remarke){Section nt = lst_Section.FirstOrDefault(p => p.name == section);if (nt != null){nt.reMark.Add(remarke.StartsWith("#") ? remarke : "#" + remarke);}else{nt = new Section();nt.name = section;nt.reMark.Add(remarke.StartsWith("#") ? remarke : "#" + remarke);lst_Section.Add(nt);}Save();}public void AddItemReMarke(string section, string key, string remarke){Section nt = lst_Section.FirstOrDefault(p => p.name == section);if (nt != null){ValueItem ct = nt.items.FirstOrDefault(p => p.key == key);if (ct != null){ct.reMark.Add(remarke.StartsWith("#") ? remarke : "#" + remarke);}else{ct = new ValueItem();ct.key = key;ct.reMark.Add(remarke.StartsWith("#") ? remarke : "#" + remarke);lst_Section.Add(nt);}}else{nt = new Section();nt.name = section;ValueItem ct = new ValueItem();ct.key = key;ct.reMark.Add(remarke.StartsWith("#") ? remarke : "#" + remarke);lst_Section.Add(nt);}Save();}private void Save(){using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8)){// 写入各个sectionforeach (Section section in lst_Section){// 写入section前的注释foreach (string comment in section.reMark){writer.WriteLine(comment);}// 写入sectionwriter.WriteLine($"[{section.name}]");// 写入键值对foreach (ValueItem cnt in section.items){//写备注foreach (string comment in cnt.reMark){writer.WriteLine(comment);}//写值writer.WriteLine($"{cnt.key}={cnt.value}");}writer.WriteLine(); // 空行分隔不同的节}}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/82573.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/82573.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/82573.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony 5.0中状态栏添加以太网状态栏图标以及功能实现

目录 1.前置条件 2.方案 1.前置条件 首先以太网接口是有问题的,如下按照如下流程将以太网接口进行修复 OpenHarmony 以太网卡热插拔事件接口无效-CSDN博客 然后上述的接口可以了就可以通过这个接口获取以太网是否连接状态 要注意wifi连接的干扰和预置虚拟网口干扰 2.方案…

RNN GRU LSTM 模型理解

一、RNN 1. 在RNN中&#xff0c; 2. RNN是一个序列模型&#xff0c;与非序列模型不同&#xff0c;序列中的元素互相影响&#xff1a; 是由 计算得来的。 在前向传播中&#xff1a; 用于计算 和 用于计算 和 因此&#xff0c;当进行反向链式法则求导时候&#xf…

多路径传输(比如 MPTCP)控制实时突发

实时突发很难控制&#xff0c;因为 “实时” 和 “突发” 相互斥。实时要求避免排队&#xff0c;而突发必然要排队&#xff0c;最终的解决方案都指向找一个公说公有理&#xff0c;婆说婆有理的中间点&#xff0c;这并没解决问题&#xff0c;只是权衡了问题。 这种局部解决问题的…

函数式编程思想详解

函数式编程思想详解 1. 核心概念 不可变数据 (Immutable Data) 数据一旦创建&#xff0c;不可修改。任何操作均生成新数据&#xff0c;而非修改原数据。 优点&#xff1a;避免副作用&#xff0c;提升并发安全&#xff0c;简化调试。 Java实现&#xff1a;使用final字段、不可变…

iOS 主要版本发布历史

截至 2025 年 5 月&#xff0c;iOS 的最新正式版本是 iOS 18&#xff0c;于 2024 年 9 月 16 日 正式发布。此前的 iOS 17 于 2023 年 9 月 18 日 发布&#xff0c;并在 2024 年被 iOS 18 取代。(维基百科) &#x1f4f1; iOS 主要版本发布历史 以下是 iOS 各主要版本的发布日…

矩阵详解:线性代数在AI大模型中的核心支柱

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

基于51单片机和8X8点阵屏、独立按键的飞行躲闪类小游戏

目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板。 【单片机】STC89C52RC 【频率】12T11.0592MHz 【外设】8X8点阵屏、独立按键 效果查看/操作演示&#xff…

区块链可投会议CCF C--APSEC 2025 截止7.13 附录用率

Conference&#xff1a;32nd Asia-Pacific Software Engineering Conference (APSEC 2025) CCF level&#xff1a;CCF C Categories&#xff1a;软件工程/系统软件/程序设计语言 Year&#xff1a;2025 Conference time&#xff1a;December 2-5, 2025 in Macao SAR, China …

pdf图片导出(Visio\Origin\PPT)

一、Visio 导入pdf格式图片 1. 设计->大小&#xff0c;适应绘图。 2. 文件->导出&#xff0c;导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边&#xff0c;可以通过以下方式设置&#xff1a; 1. 文件->选项->自定义功能区->…

vector的实现

介绍 1. 本质与存储结构 动态数组实现&#xff1a;vector 本质是动态分配的数组&#xff0c;采用连续内存空间存储元素&#xff0c;支持下标访问&#xff08;如 vec[i]&#xff09;&#xff0c;访问效率与普通数组一致&#xff08;时间复杂度 O (1)&#xff09;。动态扩容机制&…

【Linux笔记】防火墙firewall与相关实验(iptables、firewall-cmd、firewalld)

一、概念 1、防火墙firewall Linux 防火墙用于控制进出系统的网络流量&#xff0c;保护系统免受未授权访问。常见的防火墙工具包括 iptables、nftables、UFW 和 firewalld。 防火墙类型 包过滤防火墙&#xff1a;基于网络层&#xff08;IP、端口、协议&#xff09;过滤流量&a…

el-date-picker 前端时间范围选择器

控制台参数&#xff1a; 前端代码&#xff1a;用数组去接受&#xff0c;同时用 value-format"YYYY-MM-DD" 格式化值为&#xff1a;年月日格式 <!-- 查询区域 --><transition name"fade"><div class"search" v-show"showSe…

在 macOS 上安装 jenv 管理 JDK 版本

在 macOS 上安装 jenv 并管理 JDK 版本 在开发 Java 应用程序时&#xff0c;你可能需要在不同的项目中使用不同版本的 JDK。手动切换 JDK 版本可能会很繁琐&#xff0c;但幸运的是&#xff0c;有一个工具可以简化这个过程&#xff1a;jenv。jenv 是一个流行的 Java 版本管理工…

2025年全国青少年信息素养大赛复赛C++集训(16):吃糖果2(题目及解析)

2025年全国青少年信息素养大赛复赛C集训&#xff08;16&#xff09;&#xff1a;吃糖果2&#xff08;题目及解析&#xff09; 题目描述 现有n(50 > n > 0)个糖果,每天只能吃2个或者3个&#xff0c;请计算共有多少种不同的吃法吃完糖果。 时间限制&#xff1a;1000 内存…

ARM笔记-嵌入式系统基础

第一章 嵌入式系统基础 1.1嵌入式系统简介 1.1.1嵌入式系统定义 嵌入式系统定义&#xff1a; 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软硬件可剪裁&#xff0c;对功能、可靠性、成本、体积、功耗等有严格要求的专用计算机系统 ------Any devic…

大语言模型(LLM)入门项目推荐

推荐大语言模型(LLM)的入门项目 TiaoYu-1。 https://github.com/tiaoyu1122/TiaoYu-1 项目优点&#xff1a; 几乎每一行代码(一些重复的代码除外)都添加了注释&#xff0c;详细介绍了代码的作用&#xff0c;方便阅读与理解。基本上覆盖了常见 LLM 模型的全部训练流程&#x…

Linux里more 和 less的区别

在 Linux/Unix 系统中&#xff0c;more 和 less 都是用于分页查看文本文件的命令&#xff0c;但 less 是 more 的增强版&#xff0c;功能更强大。以下是它们的核心区别和用法对比&#xff1a; 1. 基础功能对比 特性moreless&#xff08;更强大&#xff09;向前翻页❌ 仅支持向…

基于PDF流式渲染的Word文档在线预览技术

一、背景介绍 在系统开发中&#xff0c;实现在线文档预览与编辑功能是许多项目的核心需求&#xff0c;但在实际的开发过程中&#xff0c;我们经常会面临以下难点&#xff1a; 1&#xff09;格式兼容性问题&#xff1a;浏览器原生不支持解析Word二进制格式&#xff0c;直接渲染会…

ai学习--python部分-1.变量名及命名空间的存储

初学代码时总有一个问题困扰我&#xff1a;a 10 # a指向地址0x1234&#xff08;存储10&#xff09; 变量a的值10存储在0x1234&#xff0c;那么变量a需要存储吗&#xff1f;a又存储在什么地址呢 目录 1. ​​命名空间的本质​​ 2. ​​命名空间的内存占用​​ 3. ​​…

Leetcode 3563. Lexicographically Smallest String After Adjacent Removals

Leetcode 3563. Lexicographically Smallest String After Adjacent Removals 1. 解题思路2. 代码实现 题目链接&#xff1a;3563. Lexicographically Smallest String After Adjacent Removals 1. 解题思路 这次的最后一题同样没有自力搞定&#xff0c;简直了…… 这道题还…