using HslCommunication.Core;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
namespace HslCommunication.BasicFramework
{
/*****************************************************************************
*
* 一些类的基类,实现一些共同的基础功能
*
* Create Date : 2017-05-03 17:45:37
*
*
* 2018年3月6日 21:38:37
* 修改:提炼接口,完善注释和分块
*
*
*****************************************************************************/
///
/// 支持字符串信息加载存储的接口,定义了几个通用的方法
///
public interface ISoftFileSaveBase
{
///
/// 获取需要保存的数据,需要重写实现
///
/// 需要存储的信息
string ToSaveString();
///
/// 从字符串加载数据,需要重写实现
///
/// 字符串数据
void LoadByString(string content);
///
/// 不使用解密方法从文件读取数据
///
void LoadByFile();
///
/// 不使用加密方法保存数据到文件
///
void SaveToFile();
///
/// 文件路径的存储
///
string FileSavePath { get; set; }
}
///
/// 文件存储功能的基类,包含了文件存储路径,存储方法等
///
public class SoftFileSaveBase
{
#region Constructor
///
/// 实例化一个文件存储的基类
///
public SoftFileSaveBase()
{
HybirdLock = new SimpleHybirdLock();
}
#endregion
#region Private Member
private SimpleHybirdLock HybirdLock; // 文件存储的同步锁
#endregion
#region Protect Member
///
/// 在日志保存时的标记当前调用类的信息
///
protected string LogHeaderText { get; set; }
#endregion
#region Save Load String
///
/// 获取需要保存的数据,需要重写实现
///
/// 需要存储的信息
public virtual string ToSaveString()
{
return string.Empty;
}
///
/// 从字符串加载数据,需要重写实现
///
/// 字符串数据
public virtual void LoadByString(string content)
{
}
#endregion
#region Save Load File
///
/// 不使用解密方法从文件读取数据
///
public virtual void LoadByFile()
{
LoadByFile(m => m);
}
///
/// 使用用户自定义的解密方法从文件读取数据
///
/// 用户自定义的解密方法
public void LoadByFile(Converter 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.FileLoadFailed, ex);
}
finally
{
HybirdLock.Leave();
}
}
}
}
///
/// 不使用加密方法保存数据到文件
///
public virtual void SaveToFile()
{
SaveToFile(m => m);
}
///
/// 使用用户自定义的加密方法保存数据到文件
///
/// 用户自定义的加密方法
public void SaveToFile(Converter 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.FileSaveFailed, ex);
}
finally
{
HybirdLock.Leave();
}
}
}
#endregion
///
/// 文件存储的路径
///
public string FileSavePath { get; set; }
///
/// 日志记录类
///
public LogNet.ILogNet ILogNet { get; set; }
}
}