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);
}
}
}