Ini配置文件读写,增加备注功能

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");

cs 复制代码
    /// <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();
                            }
                        }
                    }
                }
                //数据读取完后,追加到lst
                if (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))
            {
                // 写入各个section
                foreach (Section section in lst_Section)
                {
                    // 写入section前的注释
                    foreach (string comment in section.reMark)
                    {
                        writer.WriteLine(comment);
                    }


                    // 写入section
                    writer.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(); // 空行分隔不同的节
                }
            }
        }
    }
相关推荐
方博士AI机器人15 分钟前
GNU Octave 基础教程(1):Ubuntu 22.04 与 Windows 11 安装 Octave 全流程
windows·ubuntu·octave
k***a4292 小时前
Python 中设置布尔值参数为 True 来启用验证
开发语言·windows·python
Yolanda_20224 小时前
语音相关-浏览器的自动播放策略研究和websocket研究
websocket·网络协议·microsoft
love530love6 小时前
【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载缓存占满 C 盘问题:更改缓存位置全流程
开发语言·人工智能·windows·笔记·python·缓存·uv
计算机毕设定制辅导-无忧学长6 小时前
分布式系统中的 Kafka:流量削峰与异步解耦(二)
microsoft·kafka·linq
chilavert3188 小时前
技术演进中的开发沉思-9:window编程系列-内核对象线程同步(下)
windows
程序员的世界你不懂9 小时前
Windows下allure与jenkins的集成
windows·servlet·jenkins
方博士AI机器人10 小时前
GNU Octave 基础教程(4):变量与数据类型详解(二)
windows·ubuntu·数据分析·octave
你们补药再卷啦17 小时前
windows,java后端开发常用软件的下载,使用配置
windows