public static void SyncDownloadFile(string url, string savePath) { C_DebugHelper.Log("SyncDownloadFile 下载开始 url = " + url + ", savePath = " + savePath); using (UnityWebRequest request = UnityWebRequest.Get(url)) { request.SendWebRequest(); while (!request.isDone) { if (request.isHttpError || request.isNetworkError) { C_DebugHelper.LogWarning("request.isError" + request.isNetworkError); return; } } if (request.isHttpError || request.isNetworkError) { C_DebugHelper.LogWarning("request.isError" + request.isNetworkError); } else { C_DownloadMgr.CreatFile(url, savePath, request.downloadHandler.data); } } }
private IEnumerator Execute(string url, string savePath, Action <byte[]> callback) { C_DebugHelper.Log("AsyncDownloadFile 下载开始 url = " + url + ", savePath = " + savePath); //System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); //stopWatch.Start(); using (UnityWebRequest request = UnityWebRequest.Get(url)) { yield return(request.SendWebRequest()); if (request.isHttpError || request.isNetworkError) { C_DebugHelper.LogWarning("request.isError" + request.isNetworkError); } else { byte[] bytes = request.downloadHandler.data; if (callback != null) { callback(bytes); } C_DownloadMgr.CreatFile(url, savePath, bytes); } C_DebugHelper.Log("下载完成"); //stopWatch.Stop(); // C_DebugHelper.Log("下载完成,耗时: " + stopWatch.ElapsedMilliseconds); } }
IEnumerator MergeFile(string url, string savePath, Action callback) { while (true) { IsMerge = true; for (int i = 0; i < ThreadNum; i++) { if (ThreadStatus[i] == false) { IsMerge = false; yield return(0); System.Threading.Thread.Sleep(100); break; } } if (IsMerge) { break; } } byte[] bytes = new byte[bufferSize]; FileStream fs = new FileStream(C_DownloadMgr.StandardDownloadSavePath(url, savePath), FileMode.OpenOrCreate); FileStream fsTemp = null; for (int i = 0; i < ThreadNum; i++) { fsTemp = new FileStream(FileNames[i], FileMode.OpenOrCreate); int readBytes; while ((readBytes = fsTemp.Read(bytes, 0, bytes.Length)) > 0) { fs.Write(bytes, 0, readBytes); } fsTemp.Close(); } fs.Close(); if (callback != null) { callback(); } m_StopWatch.Stop(); C_DebugHelper.Log("下载完成,耗时: " + m_StopWatch.ElapsedMilliseconds); yield return(null); DeleteCacheFiles(); }
private const int m_nTimeOutWait = 5 * 1000; //超时等待时间 public void DownloadFile(string url, string savePath, Action callback, System.Threading.ThreadPriority threadPriority = System.Threading.ThreadPriority.Normal) { C_DebugHelper.Log("C_HttpDownloader DownloadFile url = " + url); System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); Progress = 0; DownloadFileLength = 0; m_bIsStop = false; m_Thread = new Thread(delegate() { stopWatch.Start(); //判断保存路径是否存在 if (!Directory.Exists(savePath)) { Directory.CreateDirectory(savePath); } string filePath = C_DownloadMgr.StandardDownloadSavePath(url, savePath); //string fileName = C_DownloadMgr.StandardDownloadName(url); //使用流操作文件 FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write); //获取文件现在的长度 DownloadFileLength = fs.Length; //获取下载文件的总长度 long totalLength = C_DownloadMgr.GetLength(url); //Debug.LogFormat("<color=red>文件:{0} 已下载{1}M,剩余{2}M</color>", fileName, fileLength / 1024 / 1024, (totalLength - fileLength) / 1024 / 1024); //如果没下载完 if (DownloadFileLength < totalLength) { //断点续传核心,设置本地文件流的起始位置 fs.Seek(DownloadFileLength, SeekOrigin.Begin); HttpWebRequest request = C_DownloadMgr.GetWebRequest(url); request.ReadWriteTimeout = m_nReadWriteTimeOut; request.Timeout = m_nTimeOutWait; //断点续传核心,设置远程访问文件流的起始位置 request.AddRange((int)DownloadFileLength); Stream stream = request.GetResponse().GetResponseStream(); byte[] buffer = new byte[4096]; //使用流读取内容到buffer中 //注意方法返回值代表读取的实际长度,并不是buffer有多大,stream就会读进去多少 int length = stream.Read(buffer, 0, buffer.Length); while (length > 0) { //如果Unity客户端关闭,停止下载 if (m_bIsStop) { break; } //将内容再写入本地文件中 fs.Write(buffer, 0, length); //计算进度 DownloadFileLength += length; Progress = (float)DownloadFileLength / (float)totalLength; //类似尾递归 length = stream.Read(buffer, 0, buffer.Length); } stream.Close(); stream.Dispose(); } else { Progress = 1; } fs.Close(); stopWatch.Stop(); C_DebugHelper.Log("下载完成,耗时: " + stopWatch.ElapsedMilliseconds); //如果下载完毕,执行回调 if (Progress == 1) { if (callback != null) { callback(); } m_Thread.Abort(); } }); //开启子线程 m_Thread.IsBackground = true; m_Thread.Priority = threadPriority; m_Thread.Start(); }