在這里我用了一個線程池,線程池參數接收一個帶有object參數的,無返回值的委托 ,下載用到的核心代碼,網上拷貝的,他的核心就是發起一個web請求,然后得到請求的響應,讀取響應的流
剩下的都是常見的IO操作
由於線程池接參數的委托,接收一個object參數。所以,我把請求地址和本地存放地址以及名字,封裝了一個類,用來傳參
這是下載工具代碼,如下
using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net; using UnityEngine; public class DownLoaderEnum { public string url; public string path; public DownLoaderEnum(string URL, string PATH) { url = URL; path = PATH; } } public class HttpDownload { /// <summary> /// http下載文件 /// </summary> /// <param name="url">下載文件地址</param> /// <param name="path">文件存放地址,包含文件名</param> /// <returns></returns> public void HttpDownloader(object down) { if (!Directory.Exists((down as DownLoaderEnum).path)) Directory.CreateDirectory((down as DownLoaderEnum).path); string tempPath = System.IO.Path.GetDirectoryName((down as DownLoaderEnum).path) + @"\temp"; System.IO.Directory.CreateDirectory(tempPath); //創建臨時文件目錄 string tempFile = tempPath + @"\" + System.IO.Path.GetFileName((down as DownLoaderEnum).path) + ".temp"; //臨時文件 if (System.IO.File.Exists(tempFile)) { System.IO.File.Delete(tempFile); //存在則刪除 } try { FileStream fs = new FileStream(tempFile, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); // 設置參數 HttpWebRequest request = WebRequest.Create((down as DownLoaderEnum).url) as HttpWebRequest; //發送請求並獲取相應回應數據 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才開始向目標網頁發送Post請求 Stream responseStream = response.GetResponseStream(); //創建本地文件寫入流 //Stream stream = new FileStream(tempFile, FileMode.Create); byte[] bArr = new byte[1024]; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { //stream.Write(bArr, 0, size); fs.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } //stream.Close(); fs.Close(); responseStream.Close(); string suffixName = (down as DownLoaderEnum).url; int su = suffixName.LastIndexOf('/'); suffixName = (down as DownLoaderEnum).path+suffixName.Substring(su); // Debug.LogError(suffixName); System.IO.File.Move(tempFile, suffixName); // return true; Debug.LogError("下載完成"); } catch (Exception ex) { Debug.LogError("錯誤==>>" + ex.Message); //return false; } } }
這是測試代碼
using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public string url = "http://dl172.80s.im:920/1802/[比得兔]劇場預告片/[比得兔]劇場預告片_hd.mp4"; // Use this for initialization string path = ""; HttpDownload download = new HttpDownload(); DownLoaderEnum down; private void Awake() { path = Application.streamingAssetsPath; //DirectoryInfo directory = new DirectoryInfo(path); //if (directory.Exists) // directory.Create(); //Debug.LogError(path); } // Use this for initialization void Start() { ThreadPool.SetMaxThreads(5, 5); down = new DownLoaderEnum(url, path);//請求url,存放地址,存放文件名 } // Update is called once per frame void Update() { if (Input.GetKeyDown(KeyCode.Space)) { ThreadPool.QueueUserWorkItem(download.HttpDownloader, down); } } }
可以看到,已經下載完成