本章讲述:在WPF中,使用“HttpWebRequest”类,通过“HTTP”传输协议, 实现文件下载到本地目录;主要功能有:文件流写入、文件读取、暂停/继续下载、下载进度回调。
流程:首先判断文件是否存在,如果存在并未下载完成,则读取已下载大小,然后执行后半部分数据下载;
名空间:namespace System.Net
开发流程步骤地址:https://blog.csdn.net/BYH371256/article/details/79868562
文件上传解说参考地址:
下载主要代码
/// <param name="url">下载地址</param>
/// <param name="path">保存文件地址</param>
/// <param name="indexTag">索引</param>
/// <param name="fileName">文件名称</param>
public void MultiDownload(string url, string path, int indexTag, string fileName)
{
object obj = new object();
lock (obj)
{
HttpWebRequest request = httpClient.getWebRequest(url, 0);
System.Net.ServicePointManager.DefaultConnectionLimit = 512;//默认并发数1
WebResponse response = null;
FileStream writer = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
long lStartPos = writer.Length; ;//当前文件大小
long currentLength = 0;
long totalLength = 0;//总大小
if (File.Exists(path))//断点续传
{
try
{
response = request.GetResponse();
}
catch (Exception ex) { }
if (response != null)
{
long sTotal = response.ContentLength;
if (sTotal == lStartPos)
{
close(writer);
File.Move(path, path.Replace(PERSIST_EXP, ""));
CallDownloadProgress(indexTag, fileName, sTotal, 1.0);
print("下载完成!");
return;
}
request = httpClient.getWebRequest(url, (int)lStartPos);
//设置Range值
writer.Seek(lStartPos, SeekOrigin.Begin);//指针跳转
response = request.GetResponse();
if (response != null)
{
totalLength = response.ContentLength + lStartPos; //总长度
currentLength = lStartPos; //当前长度
}
}
}
else
{
response = request.GetResponse();
if (response != null)
{
totalLength = response.ContentLength;
}
}
if (response != null)
{
Stream reader = response.GetResponseStream();
byte[] buff = new byte[1024];
int c = 0; //实际读取的字节数
while ((c = reader.Read(buff, 0, buff.Length)) > 0)
{
currentLength += c;
writer.Write(buff, 0, c);
CallDownloadProgress(indexTag, fileName, totalLength, (double)currentLength / totalLength);
writer.Flush();
//暂停处理
if (DownLoadPauseList.Exists(p => p.Index == indexTag))
{
close(writer);
if (reader != null)
{
reader.Close();
reader.Dispose();
if (response != null)
response.Close();
}
//System.Threading.Thread.Sleep(100);
return;
}
}
close(writer);
if (currentLength == totalLength)
{
File.Move(path, path.Replace(PERSIST_EXP, ""));
CallDownloadProgress(indexTag, fileName, totalLength, 1.0);
print("下载完成!");
}
if (reader != null)
{
reader.Close();
reader.Dispose();
if (response != null)
response.Close();
}
}
}
}
文件下载暂停/继续控制
/// <param name="index">暂停 索引</param>
/// <param name="isPause">是否暂停 true 暂停 false 继续</param>
public void DownLoadPause(int index, bool isPause)
{
if (isPause)
{
if (!DownLoadPauseList.Exists(p => p.Index == index))
{
DownLoadPauseList.Add(new ControlChanged(index, true));
}
}
else
{
if (DownLoadPauseList.Exists(p => p.Index == index))
{
DownLoadPauseList.Remove(DownLoadPauseList.Find(s => s.Index == index));
}
}
}
文件下载进度条回调
// 声明回调函数原型,即函数委托了
public delegate int DownloadProgress(int taskId, string fileKey, long fileLength, double percent);
// 此处相当于定义函数指针了
public DownloadProgress OnDownloadProgress = null;
// 设置回调函数地址
public void SetProgressCallBack(DownloadProgress Progress)
{
this.OnDownloadProgress = Progress;
}
/// <summary>
/// 调用回调函数
/// </summary>
/// <param name="taskId">索引</param>
/// <param name="fileKey">文件名称</param>
/// <param name="fileLength">文件大小</param>
/// <param name="percent">文件百分比</param>
public void CallDownloadProgress(int taskId, string fileKey, long fileLength, double percent)
{
if (OnDownloadProgress != null)
{
OnDownloadProgress(taskId, fileKey, fileLength, percent);
}
}
部分变量定义声明
//下载列表
public List<ControlChanged> DownLoadPauseList = new List<ControlChanged>();
//下载控制类
public class ControlChanged //: Caliburn.Micro.PropertyChangedBase
{
//要么继承Caliburn.Micro,要么重新写属性更改通知接口
public ControlChanged()
{
}
public ControlChanged(int nIndex, bool bPause)
{
Index = nIndex;
UpLoadPaused = bPause;
}
private int index = 0;
/// <summary>
/// 索引
/// </summary>
public int Index
{
get { return index; }
set
{
index = value;
NotifyOfPropertyChange(() => Index);
}
}
private bool upLoadPaused = false;
/// <summary>
/// 下载控制 暂停?
/// </summary>
public bool UpLoadPaused
{
get { return upLoadPaused; }
set
{
upLoadPaused = value;
NotifyOfPropertyChange(() => UpLoadPaused);
}
}
}
其他辅助类
/// <summary>
/// 公用 Http 请求类
/// </summary>
class httpClient
{
/// <summary>
/// 获取基础WebRequest
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="lStartPos">请求的开始位置</param>
/// <returns></returns>
public static HttpWebRequest getWebRequest(string url, int lStartPos)
{
HttpWebRequest request = null;
try
{
request = (System.Net.HttpWebRequest)HttpWebRequest.Create(url);
request.AddRange(lStartPos); //设置Range值
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return request;
}
}
private void close(FileStream writer)
{
if (writer != null)
{
writer.Close();
writer.Dispose();
}
}
public void print(Object obj)
{
Console.WriteLine(obj);
}