SoftBaseClass.cs
6.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
using HslCommunication.Core;
using System;
using System.IO;
using System.Text;
namespace HslCommunication.BasicFramework
{
/*****************************************************************************
*
* 一些类的基类,实现一些共同的基础功能
*
* Create Date : 2017-05-03 17:45:37
*
*
* 2018年3月6日 21:38:37
* 修改:提炼接口,完善注释和分块
*
*
*****************************************************************************/
/// <summary>
/// 支持字符串信息加载存储的接口,定义了几个通用的方法
/// </summary>
public interface ISoftFileSaveBase
{
/// <summary>
/// 获取需要保存的数据,需要重写实现
/// </summary>
/// <returns>需要存储的信息</returns>
string ToSaveString();
/// <summary>
/// 从字符串加载数据,需要重写实现
/// </summary>
/// <param name="content">字符串数据</param>
void LoadByString(string content);
/// <summary>
/// 不使用解密方法从文件读取数据
/// </summary>
void LoadByFile();
/// <summary>
/// 不使用加密方法保存数据到文件
/// </summary>
void SaveToFile();
/// <summary>
/// 文件路径的存储
/// </summary>
string FileSavePath { get; set; }
}
/// <summary>
/// 文件存储功能的基类,包含了文件存储路径,存储方法等
/// </summary>
/// <remarks>
/// 需要继承才能实现你想存储的数据,比较经典的例子就是存储你的应用程序的配置信息,通常的格式就是xml文件或是json文件。具体请看例子:
/// </remarks>
/// <example>
/// 下面举例实现两个字段的普通数据存储
/// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\BasicFramework\SoftFileSaveBaseExample.cs" region="SoftFileSaveBase1" title="简单示例" />
/// 然后怎么调用呢?
/// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\BasicFramework\SoftFileSaveBaseExample.cs" region="Example" title="调用示例" />
/// 如果你想实现加密存储,这样就不用关心被用户看到了。
/// <code lang="cs" source="HslCommunication_Net45.Test\Documentation\Samples\BasicFramework\SoftFileSaveBaseExample.cs" region="SoftFileSaveBase2" title="加密示例" />
/// 如果还是担心被反编译获取数据,那么这个密钥就要来自服务器的数据,本地不做存储。
/// </example>
public class SoftFileSaveBase : ISoftFileSaveBase
{
#region Constructor
/// <summary>
/// 实例化一个文件存储的基类
/// </summary>
public SoftFileSaveBase()
{
HybirdLock = new SimpleHybirdLock();
}
#endregion
#region Private Member
private SimpleHybirdLock HybirdLock; // 文件存储的同步锁
#endregion
#region Protect Member
/// <summary>
/// 在日志保存时的标记当前调用类的信息
/// </summary>
protected string LogHeaderText { get; set; }
#endregion
#region Save Load String
/// <summary>
/// 获取需要保存的数据,需要重写实现
/// </summary>
/// <returns>需要存储的信息</returns>
public virtual string ToSaveString()
{
return string.Empty;
}
/// <summary>
/// 从字符串加载数据,需要重写实现
/// </summary>
/// <param name="content">字符串数据</param>
public virtual void LoadByString(string content)
{
}
#endregion
#region Save Load File
/// <summary>
/// 不使用解密方法从文件读取数据
/// </summary>
public virtual void LoadByFile()
{
LoadByFile(m => m);
}
/// <summary>
/// 使用用户自定义的解密方法从文件读取数据
/// </summary>
/// <param name="decrypt">用户自定义的解密方法</param>
public void LoadByFile(Converter<string, string> decrypt)
{
if (FileSavePath != "")
{
if (File.Exists(FileSavePath))
{
HybirdLock.Enter();
try
{
using (StreamReader sr = new StreamReader(FileSavePath, Encoding.Default))
{
LoadByString(decrypt(sr.ReadToEnd()));
}
}
catch (Exception ex)
{
ILogNet?.WriteException(LogHeaderText, StringResources.Language.FileLoadFailed, ex);
}
finally
{
HybirdLock.Leave();
}
}
}
}
/// <summary>
/// 不使用加密方法保存数据到文件
/// </summary>
public virtual void SaveToFile()
{
SaveToFile(m => m);
}
/// <summary>
/// 使用用户自定义的加密方法保存数据到文件
/// </summary>
/// <param name="encrypt">用户自定义的加密方法</param>
public void SaveToFile(Converter<string, string> encrypt)
{
if (FileSavePath != "")
{
HybirdLock.Enter();
try
{
using (StreamWriter sw = new StreamWriter(FileSavePath, false, Encoding.Default))
{
sw.Write(encrypt(ToSaveString()));
sw.Flush();
}
}
catch (Exception ex)
{
ILogNet?.WriteException(LogHeaderText, StringResources.Language.FileSaveFailed, ex);
}
finally
{
HybirdLock.Leave();
}
}
}
#endregion
/// <summary>
/// 文件存储的路径
/// </summary>
public string FileSavePath { get; set; }
/// <summary>
/// 日志记录类
/// </summary>
public LogNet.ILogNet ILogNet { get; set; }
}
}