📄 downloadfileinfo.cs
字号:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.IO;
namespace Cblang.HttpDownload
{
/// <summary>
/// Download file info
/// </summary>
[Serializable()]
public class DownloadFileInfo
{
/// <summary>
/// 下载中的文件的扩展名
/// </summary>
public const string FilenameExt = ".bf!";
/// <summary>
/// RequestURL地址
/// </summary>
public string RequestURL
{
get;
protected set;
}
/// <summary>
/// 文件名
/// </summary>
public string FileName
{
get;
protected set;
}
/// <summary>
/// 文件大小
/// </summary>
public int TotalSize
{
get;
set;
}
/// <summary>
/// 已下载的大小
/// </summary>
public int BlockLeftSize
{
get;
set;
}
/// <summary>
/// 下载线程数
/// </summary>
public int ThreadNumber
{
get;
set;
}
/// <summary>
/// 包大小
/// </summary>
public Packet[] Packets
{
get;
set;
}
#region 构造函数
/// <summary>
/// 用于断点续传
/// </summary>
/// <param name="requestURL"></param>
/// <param name="fileName"></param>
/// <param name="totalSize"></param>
/// <param name="threadNumber"></param>
public DownloadFileInfo(string requestURL, string fileName, int totalSize, int threadNumber)
: this(requestURL, fileName)
{
InitPackets(totalSize, threadNumber);
}
/// <summary>
///
/// </summary>
/// <param name="url"></param>
/// <param name="fileName"></param>
public DownloadFileInfo(string url, string fileName)
{
RequestURL = url;
FileName = fileName;
BlockLeftSize = -1;
}
#endregion
/// <summary>
///
/// </summary>
/// <param name="totalSize">总大小</param>
/// <param name="threadNumber">线程数</param>
public void InitPackets(int totalSize, int threadNumber)
{
if (threadNumber <= 0)
{
threadNumber = 5;
}
if (totalSize <= Packet.BUFFER_SIZE) //小于64K,单线程下载
{
threadNumber = 1;
}
TotalSize = totalSize;
ThreadNumber = threadNumber;
int packetSize = totalSize / ThreadNumber;
Packets = new Packet[ThreadNumber];
for (int i = 0; i < ThreadNumber; i++)
{
Packets[i] = new Packet(i * packetSize, (i + 1) * packetSize - 1);
}
//最后一包读到未尾...
Packets[ThreadNumber - 1].To = TotalSize - 1;
BlockLeftSize = 0;
}
}
/// <summary>
/// 线程下载的包信息
/// </summary>
[Serializable()]
public class Packet
{
/// <summary>
/// 缓存大小
/// </summary>
public const int BUFFER_SIZE = 0x10000;//64k buffer size
[NonSerialized]
private byte[] buffer;
/// <summary>
/// 缓存
/// </summary>
public byte[] Buffer
{
get
{
if (buffer == null)
{
buffer = new byte[BUFFER_SIZE];
}
return buffer;
}
}
/// <summary>
/// 开始发送数据的位置
/// </summary>
public int From
{
get;
set;
}
/// <summary>
/// 停止发送数据的位置
/// </summary>
public int To
{
get;
set;
}
/// <summary>
/// 已下载的数据
/// </summary>
public int LoadSize
{
get;
set;
}
/// <summary>
///
/// </summary>
/// <param name="from">开始位置</param>
/// <param name="to">结束位置</param>
public Packet(int from, int to)
{
From = from;
To = to;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -