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(); // 空行分隔不同的节
                }
            }
        }
    }
相关推荐
Uncertainty!!1 天前
Windows 10 与 Ubuntu 22.04 通过 Samba 共享文件夹
windows·ubuntu·共享文件夹
百事牛科技1 天前
如何创建7Z压缩包?Windows下7-Zip操作方法
windows·7-zip
池央1 天前
Windows本地部署Qwen3.8实战:LM Studio、Cherry Studio、远程API与Token鉴权
windows
燕落南枝1 天前
HTML 表单入门:表单容器、文本框与密码框属性详解
前端·microsoft·html
泡海椒2 天前
JQuick-SQL 快速开始:注册内存表并执行查询
数据库·windows·sql
钱栈up2 天前
耳机音效不对,我顺手查了系统更新,结果挖出个崩溃了整天的服务
windows·shell
xiao77mwq2 天前
Wireshark 在 Windows 上没法按进程抓包,我补了一条路
windows
Helix2502 天前
MDT自动化部署实战:构建企业级Windows批量装机与PXE网络引导环境
windows·mdt自动化部署·wds网络启动·pxe引导·windows批量装机·任务序列·无人值守安装
禁默2 天前
机器人的手,为什么拿个杯子都这么难?一文看懂“灵巧操作“
人工智能·microsoft·机器人