Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        /// <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();
                }
            }
        }