You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
4.2 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Txgy.EWS.Client.Entity;
using Txgy.EWS.Client.IBLL;
using Txgy.EWS.Client.IDAL;
using Txgy.EWS.Client.ILog;
using Txgy.EWS.Client.Models;
namespace Txgy.EWS.Client.BLL
{
public class UpgradeFileBLL : IUpgradeFileBLL
{
IUpgradeDal _upgradeDal = null;
ILocalDataAccess _localDataAccess;
ILogHelper _logHelper;
public UpgradeFileBLL(IUpgradeDal upgradeDal, ILocalDataAccess localDataAccess, ILogHelper logHelper)
{
_upgradeDal = upgradeDal;
_localDataAccess = localDataAccess;
_logHelper = logHelper;
}
public async Task<List<FileInfoModel>> AllFileListAsync()
{
string infoWeb = await _upgradeDal.GetFileList();
List<UpgradeFileInfo> result = JsonConvert.DeserializeObject<List<UpgradeFileInfo>>(infoWeb);
return result.Select((s, index) => new FileInfoModel
{
Index = (index + 1).ToString("00"),
FileName = s.FileName,
UploadTime = s.UploadTime
}).ToList();
}
public async Task<List<string>> DiffFileListAsync()
{
//int a = 0;
//var v = 0 / a;
//Info
//_logHelper.Debug("UpgradeFileBLL。DiffFileListAsync。方法进入");// 侵入式利用AOP配合特性的方式 ILog
List<string> diffFiles = new List<string>();
//try
//{
// 获取文件版本信息
// 从服务器拿到更新文件列表信息文件名、MD5
string infoWeb = await _upgradeDal.GetFileList();
List<UpgradeFileInfo> fileInfoWeb = JsonConvert.DeserializeObject<List<UpgradeFileInfo>>(infoWeb);
if (fileInfoWeb?.Count > 0)
{
// 从本地缓存数据库Sqlite中取当前本地的文件信息文件名、MD5
List<UpgradeFileInfo> fileInfoLocal = _localDataAccess.GetLocalFileInfo().Select(f => new UpgradeFileInfo { FileName = f[0], FileMd5 = f[1] }).ToList();
// 对比之后返回差异的文件名称列表
// 1.Web列表中不存在于Local列表中的数据返回更新
// 2.Web列表中存在于Local列中但MD5码不一致
fileInfoWeb.ForEach(fw =>
{
if (fileInfoLocal == null ||
fileInfoLocal.Exists(fl => fl.FileName == fw.FileName && fl.FileMd5 != fw.FileMd5) ||
!fileInfoLocal.Exists(fl => fl.FileName == fw.FileName))
{
diffFiles.Add(fw.FileName + "|" + fw.FileMd5);
}
});
}
//}
//catch (Exception ex)
//{
// //_logHelper.Error(ex.Message);
// _logHelper.Error(this, ex.Message);
// throw ex;
//}
// 异常可能只会在生产环境出现、在开发环境无法重现
return diffFiles;
}
public async Task<bool> UploadFile(string fileName, string fullPath)
{
// 获取文件的MD5码并上传
var result = await _upgradeDal.UploadFiles(fileName, fullPath, this.GetMD5HashFromFile(fullPath));
return true;
}
public string GetMD5HashFromFile(string fileName)
{
try
{
FileStream file = new FileStream(fileName, System.IO.FileMode.Open);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(file);
file.Close();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
catch (Exception ex)
{
throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
}
}