SoftBaseClass.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. using HslCommunication.Core;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Text;
  7. namespace HslCommunication.BasicFramework
  8. {
  9. /*****************************************************************************
  10. *
  11. * 一些类的基类,实现一些共同的基础功能
  12. *
  13. * Create Date : 2017-05-03 17:45:37
  14. *
  15. *
  16. * 2018年3月6日 21:38:37
  17. * 修改:提炼接口,完善注释和分块
  18. *
  19. *
  20. *****************************************************************************/
  21. /// <summary>
  22. /// 支持字符串信息加载存储的接口,定义了几个通用的方法
  23. /// </summary>
  24. public interface ISoftFileSaveBase
  25. {
  26. /// <summary>
  27. /// 获取需要保存的数据,需要重写实现
  28. /// </summary>
  29. /// <returns>需要存储的信息</returns>
  30. string ToSaveString();
  31. /// <summary>
  32. /// 从字符串加载数据,需要重写实现
  33. /// </summary>
  34. /// <param name="content">字符串数据</param>
  35. void LoadByString(string content);
  36. /// <summary>
  37. /// 不使用解密方法从文件读取数据
  38. /// </summary>
  39. void LoadByFile();
  40. /// <summary>
  41. /// 不使用加密方法保存数据到文件
  42. /// </summary>
  43. void SaveToFile();
  44. /// <summary>
  45. /// 文件路径的存储
  46. /// </summary>
  47. string FileSavePath { get; set; }
  48. }
  49. /// <summary>
  50. /// 文件存储功能的基类,包含了文件存储路径,存储方法等
  51. /// </summary>
  52. public class SoftFileSaveBase
  53. {
  54. #region Constructor
  55. /// <summary>
  56. /// 实例化一个文件存储的基类
  57. /// </summary>
  58. public SoftFileSaveBase()
  59. {
  60. HybirdLock = new SimpleHybirdLock();
  61. }
  62. #endregion
  63. #region Private Member
  64. private SimpleHybirdLock HybirdLock; // 文件存储的同步锁
  65. #endregion
  66. #region Protect Member
  67. /// <summary>
  68. /// 在日志保存时的标记当前调用类的信息
  69. /// </summary>
  70. protected string LogHeaderText { get; set; }
  71. #endregion
  72. #region Save Load String
  73. /// <summary>
  74. /// 获取需要保存的数据,需要重写实现
  75. /// </summary>
  76. /// <returns>需要存储的信息</returns>
  77. public virtual string ToSaveString()
  78. {
  79. return string.Empty;
  80. }
  81. /// <summary>
  82. /// 从字符串加载数据,需要重写实现
  83. /// </summary>
  84. /// <param name="content">字符串数据</param>
  85. public virtual void LoadByString(string content)
  86. {
  87. }
  88. #endregion
  89. #region Save Load File
  90. /// <summary>
  91. /// 不使用解密方法从文件读取数据
  92. /// </summary>
  93. public virtual void LoadByFile()
  94. {
  95. LoadByFile(m => m);
  96. }
  97. /// <summary>
  98. /// 使用用户自定义的解密方法从文件读取数据
  99. /// </summary>
  100. /// <param name="decrypt">用户自定义的解密方法</param>
  101. public void LoadByFile(Converter<string, string> decrypt)
  102. {
  103. if (FileSavePath != "")
  104. {
  105. if (File.Exists(FileSavePath))
  106. {
  107. HybirdLock.Enter();
  108. try
  109. {
  110. using (StreamReader sr = new StreamReader(FileSavePath, Encoding.Default))
  111. {
  112. LoadByString(decrypt(sr.ReadToEnd()));
  113. }
  114. }
  115. catch(Exception ex)
  116. {
  117. ILogNet?.WriteException(LogHeaderText,StringResources.FileLoadFailed, ex);
  118. }
  119. finally
  120. {
  121. HybirdLock.Leave();
  122. }
  123. }
  124. }
  125. }
  126. /// <summary>
  127. /// 不使用加密方法保存数据到文件
  128. /// </summary>
  129. public virtual void SaveToFile()
  130. {
  131. SaveToFile(m => m);
  132. }
  133. /// <summary>
  134. /// 使用用户自定义的加密方法保存数据到文件
  135. /// </summary>
  136. /// <param name="encrypt">用户自定义的加密方法</param>
  137. public void SaveToFile(Converter<string, string> encrypt)
  138. {
  139. if (FileSavePath != "")
  140. {
  141. HybirdLock.Enter();
  142. try
  143. {
  144. using (StreamWriter sw = new StreamWriter(FileSavePath, false, Encoding.Default))
  145. {
  146. sw.Write(encrypt(ToSaveString()));
  147. sw.Flush();
  148. }
  149. }
  150. catch (Exception ex)
  151. {
  152. ILogNet?.WriteException(LogHeaderText,StringResources.FileSaveFailed, ex);
  153. }
  154. finally
  155. {
  156. HybirdLock.Leave();
  157. }
  158. }
  159. }
  160. #endregion
  161. /// <summary>
  162. /// 文件存储的路径
  163. /// </summary>
  164. public string FileSavePath { get; set; }
  165. /// <summary>
  166. /// 日志记录类
  167. /// </summary>
  168. public LogNet.ILogNet ILogNet { get; set; }
  169. }
  170. }