C# 七牛云文件断点续下载

49 篇文章 13 订阅

本章讲述:在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);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值