using System; using System.Collections; using System.Collections.Generic; using System.Text; namespace Apewer.Models { /// INI 文件。 [Serializable] public sealed class IniFile : IEnumerable, IToJson { List _sections = new List(); #region Constructors /// public IniFile() { } /// public IniFile(IEnumerable sections) { if (sections == null) throw new ArgumentNullException(nameof(sections)); sections.ForEach(Add); } #endregion #region CRUD /// 节的数量。 public int Count { get => _sections.Count; } /// 添加节。 public void Add(IniSection section) { if (section == null) return; _sections.Add(section); } /// 添加节。 public void Add(string name, TextField[] fields) => _sections.Add(new IniSection(name, fields)); /// 获取节。 public IniSection Get(string sectionName) { var emptyName = sectionName.IsEmpty(); foreach (var section in _sections) { if (emptyName) { if (section.Name.IsEmpty()) return section; } else { if (section.Name == sectionName) return section; } } return null; } /// 移除节。 public void Remove(IniSection section) { while (_sections.Contains(section)) _sections.Remove(section); } /// 移除节。 public void Remove(string sectionName) { var emptyName = sectionName.IsEmpty(); foreach (var section in _sections) { if (emptyName) { _sections = _sections.FindAll(x => x.Name.IsEmpty()); } else { _sections = _sections.FindAll(x => x.Name == sectionName); } } } #endregion #region IEnumerable /// public IEnumerator GetEnumerator() => new Enumerator(i => i < _sections.Count ? new Class(_sections[i]) : null); IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); #endregion #region IToJson /// public Json ToJson() { var json = Json.NewArray(); _sections.ForEach(section => json.AddItem(section.ToJson())); return json; } #endregion #region ToString const string CRLF = "\r\n"; /// public override string ToString() => ToString(CRLF); /// public string ToString(string seperator) { if (seperator.IsEmpty()) seperator = CRLF; var sb = new StringBuilder(); var noName = 0; foreach (var section in _sections) { if (section == null) continue; if (section.Name.IsEmpty()) { var count = section.Count; for (var i = 0; i < count; i++) { var field = section.GetField(i); if (Append(sb, field)) { sb.Append(seperator); noName += 1; } } } } if (noName > 1) sb.Append(seperator); foreach (var section in _sections) { if (section == null) continue; if (section.Name.NotEmpty()) { sb.Append("["); sb.Append(section.Name); sb.Append("]"); sb.Append(seperator); foreach (var field in section) { if (Append(sb, field)) { sb.Append(seperator); } } } sb.Append(seperator); } return sb.ToString(); } static bool Append(StringBuilder sb, TextField field) { var nameEmpty = field.Name.IsEmpty(); var valueEmpty = field.Value.IsEmpty(); if (nameEmpty && valueEmpty) return false; if (!nameEmpty) { sb.Append(field.Name); sb.Append(" ="); } if (!valueEmpty) { if (nameEmpty) sb.Append("; "); else sb.Append(" "); sb.Append(field.Value); } return true; } #endregion } }