private void btnCancelDownload_Click(object sender, EventArgs e) { if (IndexDownloadWorker.IsBusy) { IndexDownloadWorker.CancelAsync(); } if (AssetDowloadWorker.IsBusy) { AssetDowloadWorker.CancelAsync(); } }
private void AssetDowloadWorker_DoWork(object sender, DoWorkEventArgs e) { List <string> nameList; nameList = (List <string>)e.Argument; if (!Directory.Exists(Define.LocalPath + Define.AssetPath + "/" + Define.GameVersion)) { Directory.CreateDirectory(Define.LocalPath + Define.AssetPath + "/" + Define.GameVersion); } int total = nameList.Count; int progress = 0; long currntSize = 0; long totalSize = 0; assetProgress = total > 1 ? "已完成:0/" + total : ""; foreach (var name in nameList) { totalSize += long.Parse(Define.IndexDic[name].size); } totalSize = totalSize / 100; foreach (var name in nameList) { if (e.Cancel) { return; } string fullPathName = Define.LocalPath + Define.AssetPath + "/" + Define.GameVersion + "/" + name; string url = Define.GetAssetUrl(name); ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); HttpWebResponse response = request.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream(); Stream stream = new FileStream(fullPathName, FileMode.Create); byte[] bArr = new byte[10000]; int size = responseStream.Read(bArr, 0, bArr.Length); while (size > 0) { if (AssetDowloadWorker.CancellationPending) { e.Cancel = true; break; } stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, bArr.Length); currntSize = currntSize + size; long result = currntSize / totalSize; AssetDowloadWorker.ReportProgress((int)result); } stream.Dispose(); responseStream.Dispose(); if (e.Cancel) { File.Delete(fullPathName); // 下载到一半的文件无法使用,需作删除处理 assetProgress = ""; AssetDowloadWorker.ReportProgress(0); } else { progress = progress + 1; assetProgress = total > 1 ? "已完成:" + progress + "/" + total : ""; } } }
private void btnDownLoad_Click(object sender, EventArgs e) { if (IndexDownloadWorker.IsBusy || AssetDowloadWorker.IsBusy) { MessageBox.Show("正在下载文件,不能进行其他操作。", "", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); return; } if (listBoxResult.SelectedItems.Count < 1) { labelDownLoadInfo.Text = "尚未选择要下载的资源。\n通过检索关键字或版本对比功能展示资源列表," + "点击选择某项或多项资源,再从此处开始下载。"; return; } btnAssetDownLoad.Visible = false; btnCancelDownload.Visible = true; StringBuilder sb = new StringBuilder("开始下载:"); List <string> selectedNames = new List <string>(); foreach (var item in listBoxResult.SelectedItems) { string name = item.ToString(); if (name.IndexOf(":") >= 0) // 这里假定要下载的资源名里一定不会出现英文冒号这个符号。但愿土豆程序员不会搞我。 { if (name.Split(':')[0].Equals("Delete ")) { continue; // 当前版本已被移除的资源仅供显示用,不加入下载列表,不进行下载 } name = name.Split(':')[1]; } selectedNames.Add(name); } if (selectedNames.Count == 0) { labelDownLoadInfo.Text = "未选择下载项或选择了已被移除的资源。"; return; } if (selectedNames.Count == 1) { float size = int.Parse(Define.IndexDic[selectedNames[0]].size); sb.Append(selectedNames[0] + ", 文件大小: " + Math.Round(size / 1024, 2) + "kb. "); } else { string str; float size = 0; foreach (var name in selectedNames) { size = size + int.Parse(Define.IndexDic[name].size); } if (size > 1024) { size = size / 1024; str = "kb"; if (size > 1024) { size = size / 1024; str = "mb"; } } else { str = "byte"; } sb.Append(selectedNames[0] + "等" + selectedNames.Count + "个文件, 合计大小: " + Math.Round(size, 2) + str + ". "); } labelDownLoadInfo.Text = sb.ToString(); AssetDowloadWorker.RunWorkerAsync(selectedNames); }