WPF檔案下載幫助類
阿新 • • 發佈:2022-05-10
當我們在製作下載器時,需要知道下載進度以及檔案大小,這時候我們需要對方法進行封裝,介面方便看到效果
public class FileHelper { /// <summary> /// /// </summary> private WebRequest request = null; /// <summary> /// /// </summary> private WebResponse respone = null; /// <summary> /// /// </summary>public DownloadFileInfo fileInfo { get; private set; } /// <summary> /// 更變值委託 /// </summary> /// <param name="value"></param> public delegate void ValueHandler(long value,long maxValue); /// <summary> /// 下載完成委託 /// </summary>/// <param name="IsDownload"></param> public delegate void CompletedHandler(bool IsDownload); /// <summary> /// 值回撥事件 /// </summary> public event ValueHandler OnValueChange; /// <summary> /// 下載完成事件 /// </summary> publicevent CompletedHandler OnCompleted; public FileHelper(DownloadFileInfo details) { fileInfo = details; } /// <summary> /// 檔案下載 /// </summary> public void DownloadFile() { try { ////防呆//// if (fileInfo == null) throw new Exception($"{nameof(DownloadFileInfo)}不允許為空"); ////建立目標請求例項//// request = WebRequest.Create(fileInfo.RequestUriString); ////獲取目標物件//// respone = request.GetResponse(); ThreadPool.QueueUserWorkItem((obj) => { Stream netStream = respone.GetResponseStream(); ////建立檔案儲存//// Stream fileStream = new FileStream($"{fileInfo.SaveFileUriString}", FileMode.Create); byte[] read = new byte[1024]; long progressBarValue = 0; int realReadLen = netStream.Read(read, 0, read.Length); while (realReadLen > 0) { fileStream.Write(read, 0, realReadLen); progressBarValue += realReadLen; if (OnValueChange != null) OnValueChange(progressBarValue, respone.ContentLength); realReadLen = netStream.Read(read, 0, read.Length); } ////關閉資源//// netStream.Close(); ////關閉資源//// fileStream.Close(); ////關閉回撥//// if (OnCompleted != null) OnCompleted(true); }, null); } catch (Exception ex) { OnCompleted(false); throw ex; } } }
public class DownloadFileInfo { /// <summary> /// 請求地址 /// </summary> public string RequestUriString { get; set; } /// <summary> /// 儲存地址(全路徑,包括檔案字尾名) /// </summary> public string SaveFileUriString { get; set; } }
效果圖: