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(); // 空行分隔不同的节
                }
            }
        }
    }
相关推荐
小白爱电脑4 小时前
电脑上如何查看WiFi密码
windows·电脑
xiaocao_10239 小时前
支持在Windows电脑上使用的日程待办清单工具都有哪些?
windows
两圆相切9 小时前
Windows API 介绍及核心函数分类表
windows
小猪和纸箱9 小时前
用Windows自带的DISM命令清理被偷占的C盘空间
windows
ChoSeitaku10 小时前
NO.3数据结构栈和队列|顺序栈|共享栈|链栈|顺序队|循环队列|链队|双端队列|括号匹配|中缀表达式转后缀|后缀表达式求值
数据结构·microsoft
.m12 小时前
无法打开windows安全中心解决方案
windows
Top`12 小时前
Java 泛型 (Generics)
java·开发语言·windows
九流下半12 小时前
window wsl 环境下编译openharmony,HarmonyOS 三方库 FFmpeg
windows·ffmpeg·harmonyos·编译·openharmony·三方库
brave_zhao14 小时前
JavaBeanUtils javaBean转map, 实体类转map,实体集合转List<Map>
linux·windows·python
干净的坏蛋14 小时前
Microsoft Word 中 .doc 和 .docx 的区别
microsoft·word