/// <summary> /// 比对当前临时文件夹的文件是不是真的正确了 /// </summary> /// <returns></returns> private bool CheckTempFileCorrect() { bool isCorrect = true; foreach (var item in localFolder.fileItemClientDict.Values) { if (item.IsNeedDownload) { Log.Info($"UpdateTask.CheckTempFileCorrect():检查文件项{item.tempFilePath} -> 需要下载!"); if (!File.Exists(item.tempFilePath)) { Log.Info("UpdateTask.CheckTempFileCorrect():错误->检查文件项文件不存在" + item.tempFilePath); isCorrect = false; } else { //计算当前的MD5,确保文件正确 if (MD5Helper.Compare(item.tempFilePath, item.fileItem.MD5, item.fileItem.size)) { item.IsNeedDownload = false;//如果文件一致了那么认为它不再需要下载了 } else { Log.Info("UpdateTask.CheckTempFileCorrect():错误->检查文件项不正确,删除文件" + item.tempFilePath); File.Delete(item.tempFilePath); isCorrect = false; } } } else { Log.Info($"UpdateTask.CheckTempFileCorrect():检查文件项{item.tempFilePath} -> 不需要下载..."); } } if (isCorrect) { Log.Info("UpdateTask.CheckTempFileCorrect():检查所有文件项正确!下载完成..."); } else { Log.Info("UpdateTask.CheckTempFileCorrect():继续下载未完成的文件..."); } return(isCorrect); }
/// <summary> /// 用目标文件和服务器下载下来的xml比较md5 /// </summary> private bool CheckTargetFileMD5WithXML() { bool isCorrect = true; foreach (var item in localFolder.fileItemClientDict.Values) { if (!File.Exists(item.targetFilePath)) { Log.Warning("UpdateTask.CheckTargetFileMD5WithXML(): 目标文件不存在 " + item.targetFilePath); continue; } if (!MD5Helper.Compare(item.targetFilePath, item.fileItem.MD5, item.fileItem.size)) { isCorrect = false; Log.Warning("UpdateTask.CheckTargetFileMD5WithXML(): 目标文件和XML不一致 " + item.targetFilePath); } } return(isCorrect); }
/// <summary> /// 由一个FileItemTask下载一项文件的方法 /// </summary> /// <param name="localFileItem"></param> /// <returns></returns> private async Task DownLoadOneFile(LocalFileItem localFileItem) { if (!localFileItem.IsNeedDownload)//之前的MD5比对不需要下载就不下了 { return; } Log.Info("UpdateTask.DownLoadOneFile():开始下载文件项: " + localFileItem.fileItem.url); FileItem fileItem = localFileItem.fileItem; if (File.Exists(localFileItem.tempFilePath))//如果已经下过一个了 { if (MD5Helper.Compare(localFileItem.tempFilePath, localFileItem.fileItem.MD5, localFileItem.fileItem.size)) { //那么这个文件就不需要下载了 Log.Info("UpdateTask.DownLoadOneFile():存在一致的临时文件" + localFileItem.fileItem.relativePath); localFileItem.IsNeedDownload = false;//标记它不用下载了 return; } else { File.Delete(localFileItem.tempFilePath);//如果下好的临时文件MD5不一致,那么就删除这个以前的临时文件 } } //如果这个临时文件所在的上级文件夹不存在那么就创建 FileHelper.CheckCreateParentDir(localFileItem.tempFilePath); int isDone = 0; Interlocked.Exchange(ref isDone, 0); FileStream fs = null; //需要下载的文件是空文件,不用下载,本地直接创建一个空文件就行了。 if (localFileItem.fileItem.size == 0) { fs = new FileStream(localFileItem.tempFilePath, FileMode.Create); fs.Close(); return; } try { //下载文件的后缀加上.temp fs = new FileStream(localFileItem.tempFilePath + ".temp", FileMode.OpenOrCreate); Log.Info("UpdateTask.DownLoadOneFile():开始http连接..."); Http.Get(fileItem.url) .OnMake((req) => { req.AddRange(fs.Length);//设置断点续传 }) .OnSuccess((WebHeaderCollection collection, Stream stream) => { try { fs.Seek(fs.Length, SeekOrigin.Begin); CopyStream(stream, fs);//阻塞的下载?但是进入OnSuccess会是一个异步小线程 Log.Info("UpdateTask.DownLoadOneFile():下载成功!"); } catch (Exception e) { Log.Error($"UpdateTask.DownLoadOneFile.CopyStream():{fileItem.url}下载异常:" + e.Message); //EventError?.Invoke(e); //暂时不传出事件了 } fs.Close(); Interlocked.Increment(ref isDone);//下载完成 }) .OnFail((e) => { if (fs != null) { fs.Close(); } Log.Error($"UpdateTask.DownLoadOneFile.OnFail():{fileItem.url}下载异常:" + e.Message); //EventError?.Invoke(e); //暂时不传出事件了 Interlocked.Increment(ref isDone);//下载完成 }).Go(); while (true) { Log.Debug("UpdateTask.DownLoadOneFile():await Task.Delay(1)之前 当前执行线程id=" + Thread.CurrentThread.ManagedThreadId); await Task.Delay(1); Log.Debug("UpdateTask.DownLoadOneFile():await Task.Delay(1)之后 当前执行线程id=" + Thread.CurrentThread.ManagedThreadId); //await WaitDelay(); if (isDone > 0) { break; } } //下载成功后把文件名的.temp去掉 File.Move(localFileItem.tempFilePath + ".temp", localFileItem.tempFilePath); } catch (Exception e) { Log.Error("UpdateTask.DownLoadOneFile():下载异常:" + e.Message); if (fs != null) { fs.Close(); } } }