📄 httpdown.cs
字号:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;//网络功能
using System.IO;//流支持
using System.Threading;//线程支持
namespace pda
{
public partial class HttpDown : Form
{
public bool[] threadw; //每个线程结束标志
public string[] filenamew;//每个线程接收文件的文件名
public int[] filestartw;//每个线程接收文件的起始位置
public int[] filesizew;//每个线程接收文件的大小
public string strurl;//接受文件的URL
public bool hb;//文件合并标志
public int thread;//进程数
//public ListBox ObjList;
public string filenurl;//需要下载的文件名称
public string loccalfile;//需要保存到本地的文件名称
public ProgressBar llc;
long filesize;
public HttpDown()
{
InitializeComponent();
}
public void hbfile()
{
while (true)//等待
{
hb = true;
for (int i = 0; i < thread; i++)
{
if (threadw[i] == false)//有未结束线程,等待
{
hb = false;
Thread.Sleep(100);
break;
}
}
if (hb == true)//所有线程均已结束,停止等待,
{
break;
}
}
FileStream fs;//开始合并
FileStream fstemp;
FileInfo fl;
int readfile;
byte[] bytes = new byte[512];
fs = new FileStream(loccalfile , System.IO.FileMode.Create);
for (int k = 0; k < thread; k++)
{
fstemp = new FileStream(filenamew[k], System.IO.FileMode.Open);
while (true)
{
readfile = fstemp.Read(bytes, 0, 512);
if (readfile > 0)
{
fs.Write(bytes, 0, readfile);
}
else
{
break;
}
}
fstemp.Close();
fl = new FileInfo(filenamew[k]);
fl.Delete();
fl = null;
}
fs.Close();
// DateTime dt = DateTime.Now;
//textBox1.Text = dt.ToString();//结束时间
MessageBox.Show("接收完毕......!~");
}
public void myThread()
{
}
private void button1_Click_1(object sender, EventArgs e)
{
//GlobalHttpDown gl = new GlobalHttpDown();
// gl.startHttpDown();
//DateTime dt = DateTime.Now;//开始接收时间
//textBox1.Text = dt.ToString();
strurl = "http://192.168.1.8:8080/tcgm/liKX_jsp/uploadfile/20090214123718187.doc";
//ObjList = listBox1;
llc = progressBar1;
HttpWebRequest request;
filesize = 0;
try
{
request = (HttpWebRequest)HttpWebRequest.Create(strurl);
filesize = request.GetResponse().ContentLength;//取得目标文件的长度
request.Abort();
}
catch (Exception er)
{
MessageBox.Show(er.Message);
}
// 接收线程数
thread = Convert.ToInt32("1", 10);
//根据线程数初始化数组
threadw = new bool[thread];
filenamew = new string[thread];
filestartw = new int[thread];
filesizew = new int[thread];
//计算每个线程应该接收文件的大小
int filethread = (int)filesize / thread;//平均分配
int filethreade = filethread + (int)filesize % thread;//剩余部分由最后一个线程完成
if (filethread == 0)
MessageBox.Show("没有接收的数据!!!");
{
//为数组赋值
for (int i = 0; i < thread; i++)
{
threadw[i] = false;//每个线程状态的初始值为假
filenamew[i] = i.ToString() + ".dat";//每个线程接收文件的临时文件名
if (i < thread - 1)
{
filestartw[i] = filethread * i;//每个线程接收文件的起始点
filesizew[i] = filethread - 1;//每个线程接收文件的长度
}
else
{
filestartw[i] = filethread * i;
filesizew[i] = filethreade - 1;
}
}
//定义线程数组,启动接收线程
Thread[] threadk = new Thread[thread];
HttpFile[] httpfile = new HttpFile[thread];
for (int j = 0; j < thread; j++)
{
httpfile[j] = new HttpFile(this, j);
threadk[j] = new Thread(new ThreadStart(httpfile[j].receive));
threadk[j].Start();
}
//启动合并各线程接收的文件线程
Thread hbth = new Thread(new ThreadStart(hbfile));
hbth.Start();
}
}
public class HttpFile
{
public HttpDown formm;
public int threadh;//线程代号
public string filename;//文件名
public string strUrl;//接收文件的URL
public FileStream fs;
public HttpWebRequest request;
public System.IO.Stream ns;
public byte[] nbytes;//接收缓冲区
public int nreadsize;//接收字节数
public HttpFile(HttpDown form, int thread)//构造方法
{
formm = form;
threadh = thread;
}
HttpFile()//析构方法
{
formm.Dispose();
}
public void receive()//接收线程
{
filename = formm.filenamew[threadh];
strUrl = formm.strurl;
ns = null;
nbytes = new byte[512];
nreadsize = 0;
//formm.ObjList.Items.Add("线程" + threadh.ToString() + "开始接收");
fs = new FileStream(filename, System.IO.FileMode.Create);
try
{
formm.llc.Minimum = 0;
formm.llc.Maximum = (int)nreadsize;
request = (HttpWebRequest)HttpWebRequest.Create(strUrl);
//接收的起始位置及接收的长度
request.AddRange(formm.filestartw[threadh],
formm.filestartw[threadh] + formm.filesizew[threadh]);
ns = request.GetResponse().GetResponseStream();//获得接收流
nreadsize = ns.Read(nbytes, 0, 512);
while (nreadsize > 0)
{
fs.Write(nbytes, 0, nreadsize);
nreadsize = ns.Read(nbytes, 0, 512);
formm.llc.Value =formm.llc.Value+ 512;
// formm.ObjList.Items.Add("线程" + threadh.ToString() + "正在接收");
}
fs.Close();
ns.Close();
}
catch (Exception er)
{
MessageBox.Show(er.Message);
fs.Close();
}
//formm.ObjList.Items.Add("进程" + threadh.ToString() + "接收完毕!");
MessageBox.Show("接收完毕!");
formm.threadw[threadh] = true;
}
}
private void HttpDown_Load(object sender, EventArgs e)
{
GlobalClass g = new GlobalClass();
loccalfile = g.getAppDir() + "\\20090214123718187.doc";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
private void progressBar1_ParentChanged(object sender, EventArgs e)
{
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -