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(); // 空行分隔不同的节
                }
            }
        }
    }
相关推荐
Univin2 小时前
8.25作业
数据结构·windows
徐子元竟然被占了!!2 小时前
Windows Server 2019 DateCenter搭建 FTP 服务器
运维·服务器·windows
winkel_wang2 小时前
身份管理与安全 (Protect identities)
windows·安全
正经教主3 小时前
[特殊字符]Windows 资源监视器使用指南:查端口以后不用敲命令了
windows
重启的码农12 小时前
Windows虚拟显示器MttVDD源码分析 (6) 高级色彩与HDR管理
c++·windows·操作系统
CHEN5_0212 小时前
【Java集合】List,Map,Set-详细讲解
java·windows·list
专注VB编程开发20年14 小时前
.NET组件读取压缩包中的内存数据电子表格XLSX文件和图片,不需要解压
linux·服务器·windows·c#·.net·excel·zip
SJjiemo15 小时前
FileMenu Tools for Win:突破 Windows 文件管理困境的利器
windows
岁月栖迟21 小时前
leetcode 49. 字母异位词分组
windows·算法·leetcode
十五年专注C++开发1 天前
通信中间件 Fast DDS(二) :详细介绍
linux·c++·windows·中间件·fastdds