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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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);
}
}
}
}