ConfigFileIO.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using System.Collections.Generic;
  2. using System.IO;
  3. using System.Linq;
  4. using System.Text;
  5. namespace Island.StandardLib.Utils
  6. {
  7. /// <summary>
  8. /// 本地配置文件的读写程序
  9. /// </summary>
  10. public class ConfigFileIO
  11. {
  12. private class Statement
  13. {
  14. internal bool isCommit;
  15. internal string name, value;
  16. internal Statement(string commit)
  17. {
  18. name = commit;
  19. isCommit = true;
  20. }
  21. internal Statement(string name, string value)
  22. {
  23. this.name = name;
  24. this.value = value;
  25. }
  26. internal string toLine()
  27. {
  28. StringBuilder sb = new StringBuilder();
  29. if (isCommit)
  30. {
  31. sb.Append("#");
  32. sb.Append(name);
  33. }
  34. else
  35. {
  36. sb.Append(name);
  37. sb.Append("=");
  38. sb.Append(value);
  39. }
  40. return sb.ToString();
  41. }
  42. internal static Statement readLine(string line)
  43. {
  44. line = line.Trim().Replace("\n", "");
  45. if (line.Length == 0) return new Statement("");
  46. if (line[0] == '#') return new Statement(line.Substring(1));
  47. if (!line.Contains('=')) return new Statement(line);
  48. return new Statement(line.Substring(0, line.IndexOf('=')), line.Substring(line.IndexOf('=') + 1));
  49. }
  50. }
  51. List<Statement> statements;
  52. string file;
  53. /// <summary>
  54. /// 用文件路径初始化读写器
  55. /// </summary>
  56. /// <param name="file"></param>
  57. public ConfigFileIO(string file)
  58. {
  59. this.file = file;
  60. statements = new List<Statement>();
  61. StreamReader sr = new StreamReader(file, Encoding.UTF8);
  62. string buf;
  63. while ((buf = sr.ReadLine()) != null)
  64. statements.Add(Statement.readLine(buf));
  65. sr.Close();
  66. }
  67. public ConfigFileIO()
  68. {
  69. statements = new List<Statement>();
  70. }
  71. public string StorageFile { get => file; set => file = value; }
  72. /// <summary>
  73. /// 获取或设置一个属性,注意设置属性后如果要更改到硬盘需要手动调用 <see cref="Save"/> 保存更改
  74. /// </summary>
  75. /// <param name="name">属性名</param>
  76. /// <returns>属性值</returns>
  77. public string this[string name]
  78. {
  79. get
  80. {
  81. foreach (Statement statement in statements)
  82. {
  83. if (!statement.isCommit && statement.name == name)
  84. return statement.value;
  85. }
  86. return null;
  87. }
  88. set
  89. {
  90. foreach (Statement statement in statements)
  91. {
  92. if (!statement.isCommit && statement.name == name)
  93. {
  94. statement.value = value;
  95. return;
  96. }
  97. }
  98. statements.Add(new Statement(name, value));
  99. }
  100. }
  101. /// <summary>
  102. /// 添加注释,注意手动 <see cref="Save"/>(若需要)
  103. /// </summary>
  104. /// <param name="commit">注释内容</param>
  105. public void AddCommit(string commit) => statements.Add(new Statement(commit));
  106. /// <summary>
  107. /// 获取值,如果没有那个属性则返回给定值
  108. /// </summary>
  109. /// <param name="name">属性名</param>
  110. /// <param name="default_ifnull">给定值</param>
  111. /// <returns>属性值</returns>
  112. public string SoftGet(string name, string default_ifnull = "")
  113. {
  114. string value = this[name];
  115. if (value == null) return default_ifnull;
  116. else return value;
  117. }
  118. /// <summary>
  119. /// 保存更改到硬盘
  120. /// </summary>
  121. public void Save()
  122. {
  123. StreamWriter sw = new StreamWriter(file, false, Encoding.UTF8);
  124. foreach (Statement statement in statements)
  125. sw.WriteLine(statement.toLine());
  126. sw.Flush();
  127. sw.Close();
  128. }
  129. }
  130. }