using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Threading;
using System.Net;
using System.IO;
namespace WebAppTest
{
public partial class download : System.Web.UI.Page
{
protected void Page_Load(
object sender, EventArgs e)
{
//断点下载大文件
//原理:使用多个线程将一个文件分成多个文件进行下载
MutilDownload();
}
public void MutilDownload()
{
int threadcount =
3;
int threadCompleteNum =
0;
string[] files =
new string[threadcount];
int total = (
int)GetDownloadFileSize();
int per = total /
threadcount;
for (
int i =
1; i <= threadcount; i++
)
{
int from = (i -
1) * per+
1;
int to = i *
per;
if (i ==
1)
{
from =
0;
}
if (i ==
threadcount)
{
to =
total;
}
string path = Server.MapPath(
"~/resource/video/");
if (!
Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
int index =
i;
Thread thread =
new Thread(() =>
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(
"http://192.168.1.100:106/test/test.avi");
request.Method =
"get";
request.AddRange(from, to);
HttpWebResponse response =
(HttpWebResponse)request.GetResponse();
string filename = path + index +
".avi";
files[index-
1] =
filename;
using (FileStream fs =
new FileStream(filename, FileMode.CreateNew))
{
byte[] buffer =
new byte[
5 *
1024 *
1024];
int r;
using (Stream stream =
response.GetResponseStream())
{
while ((r = stream.Read(buffer,
0, buffer.Length)) !=
0)
{
fs.Write(buffer, 0, r);
}
}
}
threadCompleteNum++
;
if (threadCompleteNum ==
threadcount)
{
//和并临时文件
string allFilename = path +
"all.avi";
using (FileStream allFile =
new FileStream(allFilename, FileMode.CreateNew))
{
for (
int j =
0; j < files.Length; j++
)
{
using (FileStream tempFile =
new FileStream(files[j], FileMode.Open))
{
byte[] tempBuffer =
new byte[
5 *
1024 *
1024];
int t;
while ((t = tempFile.Read(tempBuffer,
0, tempBuffer.Length)) !=
0)
{
allFile.Write(tempBuffer, 0, t);
}
}
}
}
//删除临时文件
foreach (
var f
in files)
{
if (File.Exists(f))
{
File.Delete(f);
}
}
}
});
thread.IsBackground =
true;
thread.Start();
}
}
//获取下载文件大小
public long GetDownloadFileSize()
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(
"http://192.168.1.100:106/test/test.avi");
request.Method =
"get";
HttpWebResponse response =
(HttpWebResponse)request.GetResponse();
return response.ContentLength;
}
}
}
转载于:https://www.cnblogs.com/zoro-zero/p/4181140.html