using System; using System.IO; using System.Net; using System.Threading; using System.Windows.Threading; namespace XHZB.Desktop.Utils { internal class DownloadUtil { public static void downloadFile(string url, string savepath) { string path = savepath; string filename = url.Substring(url.LastIndexOf("/") + 1); if (!url.StartsWith("http") || filename == null || filename == "") { return; } path += filename; // 设置参数 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 Stream stream = new FileStream(path, FileMode.Create); byte[] bArr = new byte[1024]; 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(); responseStream.Close(); } /// /// Http下载文件 /// public static Thread downloadFileWithCallback( string url, int position, string savepath, Dispatcher dispatcher, DownloadCallback callback ) { string path = savepath; string filename = url.Substring(url.LastIndexOf("/") + 1); path += filename; if (!url.StartsWith("http") || filename == null || filename == "") { return null; } Thread thread = new Thread(o => { FileInfo fi = new FileInfo(path); if (fi.Exists) { dispatcher.Invoke(new Action(() => { callback.downloadEnd(position, path); })); } else { string temppath = path + ".tmp"; if (File.Exists(temppath)) { //File.Delete(temppath); temppath += "1"; while (File.Exists(temppath)) { temppath += "1"; if (!File.Exists(temppath)) { break; } } } dispatcher.Invoke(new Action(() => { callback.downloadBegin(position); })); try { HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; HttpWebResponse response = request.GetResponse() as HttpWebResponse; Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 Stream stream = new FileStream(temppath, FileMode.Create); long totalSize = response.ContentLength; byte[] bArr = new byte[1024]; int size = responseStream.Read(bArr, 0, bArr.Length); long readsize = 0; while (size > 0) { readsize += size; stream.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, bArr.Length); dispatcher.Invoke(new Action(() => { callback.downloadProgress(position, (int)(readsize * 100 / totalSize)); })); } stream.Close(); responseStream.Close(); FileInfo fitemp = new FileInfo(temppath); fitemp.MoveTo(path); dispatcher.Invoke(new Action(() => { callback.downloadEnd(position, path); })); } catch (Exception ex) { dispatcher.Invoke(new Action(() => { callback.downloadError(position, ex.Message); })); } } }); thread.Start(); return thread; } public static void downloadFileWithCallback( string url, int position, Dispatcher dispatcher, DownloadCallback callback ) { string path = APP.tempPath; downloadFileWithCallback(url, position, path, dispatcher, callback); } public interface DownloadCallback { /// /// 下载开始 /// /// void downloadBegin(int position); /// /// 下载过程 /// /// /// void downloadProgress(int position, int progress); /// /// 下载结束 /// /// /// void downloadEnd(int position, string filepath); /// /// 下载结束 /// /// /// void downloadError(int position, string msg); } } }