using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace Island.StandardLib.Utils
{
///
/// 本地配置文件的读写程序
///
public class ConfigFileIO
{
private class Statement
{
internal bool isCommit;
internal string name, value;
internal Statement(string commit)
{
name = commit;
isCommit = true;
}
internal Statement(string name, string value)
{
this.name = name;
this.value = value;
}
internal string toLine()
{
StringBuilder sb = new StringBuilder();
if (isCommit)
{
sb.Append("#");
sb.Append(name);
}
else
{
sb.Append(name);
sb.Append("=");
sb.Append(value);
}
return sb.ToString();
}
internal static Statement readLine(string line)
{
line = line.Trim().Replace("\n", "");
if (line.Length == 0) return new Statement("");
if (line[0] == '#') return new Statement(line.Substring(1));
if (!line.Contains('=')) return new Statement(line);
return new Statement(line.Substring(0, line.IndexOf('=')), line.Substring(line.IndexOf('=') + 1));
}
}
List statements;
string file;
///
/// 用文件路径初始化读写器
///
///
public ConfigFileIO(string file)
{
this.file = file;
statements = new List();
StreamReader sr = new StreamReader(file, Encoding.UTF8);
string buf;
while ((buf = sr.ReadLine()) != null)
statements.Add(Statement.readLine(buf));
sr.Close();
}
public ConfigFileIO()
{
statements = new List();
}
public string StorageFile { get => file; set => file = value; }
///
/// 获取或设置一个属性,注意设置属性后如果要更改到硬盘需要手动调用 保存更改
///
/// 属性名
/// 属性值
public string this[string name]
{
get
{
foreach (Statement statement in statements)
{
if (!statement.isCommit && statement.name == name)
return statement.value;
}
return null;
}
set
{
foreach (Statement statement in statements)
{
if (!statement.isCommit && statement.name == name)
{
statement.value = value;
return;
}
}
statements.Add(new Statement(name, value));
}
}
///
/// 添加注释,注意手动 (若需要)
///
/// 注释内容
public void AddCommit(string commit) => statements.Add(new Statement(commit));
///
/// 获取值,如果没有那个属性则返回给定值
///
/// 属性名
/// 给定值
/// 属性值
public string SoftGet(string name, string default_ifnull = "")
{
string value = this[name];
if (value == null) return default_ifnull;
else return value;
}
///
/// 保存更改到硬盘
///
public void Save()
{
StreamWriter sw = new StreamWriter(file, false, Encoding.UTF8);
foreach (Statement statement in statements)
sw.WriteLine(statement.toLine());
sw.Flush();
sw.Close();
}
}
}