コード例 #1
0
        private void btnCancelDownload_Click(object sender, EventArgs e)
        {
            if (IndexDownloadWorker.IsBusy)
            {
                IndexDownloadWorker.CancelAsync();
            }

            if (AssetDowloadWorker.IsBusy)
            {
                AssetDowloadWorker.CancelAsync();
            }
        }
コード例 #2
0
        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 : "";
                }
            }
        }
コード例 #3
0
        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);
        }