发布0115
大石头 编写于 2020-01-15 01:11:37
X
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

namespace NewLife.Configuration
{
    /// <summary>Ini文件配置提供者</summary>
    /// <remarks>
    /// 支持从不同配置文件加载到不同配置模型
    /// </remarks>
    public class InIConfigProvider : FileConfigProvider
    {
        /// <summary>读取配置文件,得到字典</summary>
        /// <param name="fileName"></param>
        /// <returns></returns>
        protected override IDictionary<String, String> OnRead(String fileName)
        {
            var lines = File.ReadAllLines(fileName);
            var dic = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);

            var section = "";
            foreach (var item in lines)
            {
                var str = item.Trim();
                if (str.IsNullOrEmpty()) continue;
                if (str[0] == '#') continue;
                if (str[0] == ';') continue;

                if (str[0] == '[' && str[str.Length - 1] == ']')
                {
                    section = str.Trim('[', ']');
                }
                else
                {
                    var p = str.IndexOf('=');
                    if (p > 0)
                    {
                        var name = str.Substring(0, p).Trim();
                        if (!section.IsNullOrEmpty()) name = $"{section}:{name}";
                        dic[name] = str.Substring(p + 1).Trim();
                    }
                }
            }

            return dic;
        }

        /// <summary>把字典写入配置文件</summary>
        /// <param name="fileName"></param>
        /// <param name="source"></param>
        protected override void OnWrite(String fileName, IDictionary<String, String> source)
        {
            var dic = new Dictionary<String, Object>();
            Map(source, dic);

            // 分组写入
            //todo 需要写入Ini注释
            var sb = new StringBuilder();
            foreach (var item in dic)
            {
                if (item.Value is IDictionary<String, Object> dic2)
                {
                    // 段前空一行
                    sb.AppendLine();
                    sb.AppendLine($"[{item.Key}]");

                    // 写入当前段
                    foreach (var elm in dic2)
                    {
                        sb.AppendLine($"{elm.Key} = {elm.Value}");
                    }
                }
                else
                {
                    sb.AppendLine($"{item.Key} = {item.Value}");
                }
            }

            File.WriteAllText(fileName, sb.ToString());
        }
    }
}