using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Net;
using u8 = System.Byte;
using u16 = System.UInt16;
using s32 = System.Int32;
using u32 = System.UInt32;
using f32 = System.Single;
namespace ConsoleApplication1
{
public class HttpDownloadFile
{
public void SetURL(string URL)
{
mURL = URL;
}
//单线程下载文件大小阀值
public void SetSingleThFileSize(u32 FileSize)
{
mSingleThFileSize = FileSize;
}
//下载速度KB/S,需要外部循环调用Run函数更新这个值
public f32 GetDownloadSpeed()
{
return mDownloadSpeed / 1024;
}
//添加异步下载文件,这里提供输入文件大小的原因是
//方便灵活扩展,比如游戏更新,我们有可能先同步下载一个version.txt的
//文件里面包含类似md5和文件大小与本地比较找到需要下载的文件
//这时我们已经可以从version.txt里面提前知道需要下载文件的大小了
public void AddAsyncDownloadFile(string RemoteFilePath, string LocalFilePath, u32 RemoteFileSize = 0)
{
mDownloadFiles.Add(new DownloadFile(RemoteFilePath, LocalFilePath, RemoteFileSize));
}
//同步下载文件
public bool SyncDownloadFile(string RemoteFilePath, string LocalFilePath)
{
try
{
var HttpRequest = WebRequest.Create(mURL + "//" + RemoteFilePath) as HttpWebRequest;
var HttpResponse = HttpRequest.GetResponse() as HttpWebResponse;
var HttpStream = HttpResponse.GetResponseStream();
_PrepareDirForFile(LocalFilePath);
var OutStream = new FileStream(LocalFilePath, FileMode.Create);
var Buffer = new Byte[1024];
var ReadBytes = 0;
while (true)
{
ReadBytes = HttpStream.Read(Buffer, 0, Buffer.Length);
if (ReadBytes <= 0)
{
break;
}
OutStream.Write(Buffer, 0, ReadBytes);
}
OutStream.Close();
HttpStream.Close();
HttpResponse.Close();
HttpRequest.Abort();
return true;
}
catch (WebException e)
{
Console.WriteLine(e.Message);
return false;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return false;
}
}
public void StartAsyncDownloadFiles()
{
_CutFile();
Thread t;
for (s32 i = 0; i < Environment.ProcessorCount; ++i)
{
t = new Thread(new ParameterizedThreadStart(_AsyncDownloadFiles));
t.Start(i);
}
//文件下载进度、总下载进度、下载完成事件请自行添加了...
}
void Run(f32 TimeDelta)
{
if (mDownloadBytes >= mTotalDownloadBytes)
{
return;
}
mTimeDelta += TimeDelta;
if (mTimeDelta >= 1.0f)
{
mDownloadSpeed = mDownloadBytesCounter;
C#实现http多线程断点续传下载文件
最新推荐文章于 2026-05-20 07:07:19 发布
这是一个使用C#编写的示例,演示如何实现多线程HTTP断点续传文件下载。代码创建了一个`HttpDownloadFile`类,支持设置URL、单线程文件大小阀值、添加异步下载文件任务以及开始异步下载。通过`SyncDownloadFile`方法进行同步下载,而`StartAsyncDownloadFiles`方法启动多线程异步下载,每个线程下载一部分文件块,最后合并成完整的文件。此外,还提供了获取下载速度的方法。

2163

被折叠的 条评论
为什么被折叠?



