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");
/// <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(); // 空行分隔不同的节
}
}
}
}