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> AllFileListAsync() { string infoWeb = await _upgradeDal.GetFileList(); List result = JsonConvert.DeserializeObject>(infoWeb); return result.Select((s, index) => new FileInfoModel { Index = (index + 1).ToString("00"), FileName = s.FileName, UploadTime = s.UploadTime }).ToList(); } public async Task> DiffFileListAsync() { //int a = 0; //var v = 0 / a; //Info //_logHelper.Debug("UpgradeFileBLL。DiffFileListAsync。方法进入");// 侵入式,利用AOP配合特性的方式 ILog List diffFiles = new List(); //try //{ // 获取文件版本信息 // 从服务器拿到更新文件列表信息(文件名、MD5) string infoWeb = await _upgradeDal.GetFileList(); List fileInfoWeb = JsonConvert.DeserializeObject>(infoWeb); if (fileInfoWeb?.Count > 0) { // 从本地缓存数据库(Sqlite)中取当前本地的文件信息(文件名、MD5) List 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 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); } } } }