WPF桌面端开发11-文件下载 发表于 2020-02-04 | 分类于 wpf WPF桌面端开发11-文件下载 前言下载工具类,实现了 同步异步下载,自动转换线程 下载进度条 多文件同时下载,定位文件 临时文件机制确保下载过程中中断不收影响 工具类123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236using System;using System.IO;using System.Net;using System.Threading;using System.Windows.Threading;namespace z_screen_recorder.Utils{ public class ZDownloadUtil { public static void DownloadFile ( string url, string saveFolder ) { var path = saveFolder; string filename = url.Substring( url.LastIndexOf( "/", StringComparison.Ordinal ) + 1 ); if (!url.StartsWith( "http" ) || filename == "") { return; } path += filename; // 设置参数 //发送请求并获取相应回应数据 if (WebRequest.Create( url ) is HttpWebRequest request) { //直到request.GetResponse()程序才开始向目标网页发送Post请求 if (request.GetResponse() is HttpWebResponse response) { Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 Stream stream = new FileStream( path, FileMode.Create ); byte[] bArr = new byte[1024]; if (responseStream != null) { int size = responseStream.Read( bArr, 0, bArr.Length ); while (size > 0) { stream.Write( bArr, 0, size ); size = responseStream.Read( bArr, 0, bArr.Length ); } } stream.Close(); if (responseStream != null) responseStream.Close(); } } } /// <summary> /// Http下载文件 /// </summary> public static void DownloadFileWithCallback ( string url, int tag, string saveFolder, Dispatcher dispatcher, IZDownloadCallback callback ) { var path = saveFolder; string filename = url.Substring( url.LastIndexOf( "/", StringComparison.Ordinal ) + 1 ); path += filename; if (!url.StartsWith( "http" ) || filename == "") { return; } new Thread( o => { FileInfo fi = new FileInfo( path ); if (fi.Exists) { dispatcher.Invoke( () => { callback.DownloadEnd( tag, path ); } ); } else { var temppath = path + ".tmp"; dispatcher.Invoke( () => { callback.DownloadBegin( tag ); } ); if (WebRequest.Create( url ) is HttpWebRequest request) { if (request.GetResponse() is HttpWebResponse response) { Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 Stream stream = new FileStream( temppath, FileMode.Create ); long totalSize = response.ContentLength; byte[] bArr = new byte[1024]; if (responseStream != null) { int size = responseStream.Read( bArr, 0, bArr.Length ); int readsize = 0; while (size > 0) { readsize += size; stream.Write( bArr, 0, size ); size = responseStream.Read( bArr, 0, bArr.Length ); var readsize1 = readsize; dispatcher.Invoke( () => { callback.DownloadProgress( tag, (int)(readsize1 * 100 / totalSize) ); } ); } } stream.Close(); if (responseStream != null) responseStream.Close(); } } FileInfo fitemp = new FileInfo( temppath ); fitemp.MoveTo( path ); dispatcher.Invoke( () => { callback.DownloadEnd( tag, path ); } ); } } ).Start(); } public interface IZDownloadCallback { /// <summary> /// 下载开始 /// </summary> /// <param name="tag"></param> void DownloadBegin ( int tag ); /// <summary> /// 下载过程 /// </summary> /// <param name="tag"></param> /// <param name="progress"></param> void DownloadProgress ( int tag, int progress ); /// <summary> /// 下载结束 /// </summary> /// <param name="tag"></param> /// <param name="filepath"></param> void DownloadEnd ( int tag, string filepath ); } }}