You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
196 lines
5.1 KiB
196 lines
5.1 KiB
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
|
|
namespace Apewer.Models
|
|
{
|
|
|
|
/// <summary>INI 文件。</summary>
|
|
[Serializable]
|
|
public sealed class IniFile : IEnumerable<IniSection>, IToJson
|
|
{
|
|
|
|
List<IniSection> _sections = new List<IniSection>();
|
|
|
|
#region Constructors
|
|
|
|
/// <summary></summary>
|
|
public IniFile() { }
|
|
|
|
/// <summary></summary>
|
|
public IniFile(IEnumerable<IniSection> sections)
|
|
{
|
|
if (sections == null) throw new ArgumentNullException(nameof(sections));
|
|
sections.ForEach(Add);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CRUD
|
|
|
|
/// <summary>节的数量。</summary>
|
|
public int Count { get => _sections.Count; }
|
|
|
|
/// <summary>添加节。</summary>
|
|
public void Add(IniSection section)
|
|
{
|
|
if (section == null) return;
|
|
_sections.Add(section);
|
|
}
|
|
|
|
/// <summary>添加节。</summary>
|
|
public void Add(string name, TextField[] fields) => _sections.Add(new IniSection(name, fields));
|
|
|
|
/// <summary>获取节。</summary>
|
|
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;
|
|
}
|
|
|
|
/// <summary>移除节。</summary>
|
|
public void Remove(IniSection section)
|
|
{
|
|
while (_sections.Contains(section)) _sections.Remove(section);
|
|
}
|
|
|
|
/// <summary>移除节。</summary>
|
|
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<IniSection>
|
|
|
|
/// <summary></summary>
|
|
public IEnumerator<IniSection> GetEnumerator() => new Enumerator<IniSection>(i => i < _sections.Count ? new Class<IniSection>(_sections[i]) : null);
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
|
|
|
|
#endregion
|
|
|
|
#region IToJson
|
|
|
|
/// <summary></summary>
|
|
public Json ToJson()
|
|
{
|
|
var json = Json.NewArray();
|
|
_sections.ForEach(section => json.AddItem(section.ToJson()));
|
|
return json;
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region ToString
|
|
|
|
const string CRLF = "\r\n";
|
|
|
|
/// <summary></summary>
|
|
public override string ToString() => ToString(CRLF);
|
|
|
|
/// <summary></summary>
|
|
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
|
|
|
|
}
|
|
|
|
}
|
|
|