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;
mTimeDelta = .0f;
C#实现http多线程断点续传下载文件
最新推荐文章于 2024-03-13 14:38:31 发布