当我们在制作下载器时,需要知道下载进度以及文件大小,这时候我们需要对方法进行封装,界面方便看到效果
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> public event 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; } }
效果图: