C# 下载文件并显示进度等信息
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{<!-- -->
public partial class Form1 : Form
{<!-- -->
private WebRequest httpRequest;
private WebResponse httpResponse;
private byte[] buffer;
private Thread downloadThread;
Stream ns;
private string filename = Path.Combine( AppDomain.CurrentDomain.BaseDirectory,"1.war");
private FileStream fs;
private long length;
private long downlength = 0;
private long lastlength = 0;
public delegate void updateData(string value); //设置委托用来更新主界面
private int totalseconds = 0; //总用时
private updateData UIDel; //
public Form1()
{<!-- -->
InitializeComponent();
buffer = new byte[100000];
}
private void button1_Click(object sender, EventArgs e)
{<!-- -->
httpRequest = WebRequest.Create("http://mirrors.jenkins.io/war-stable/latest/jenkins.war");
httpResponse = httpRequest.GetResponse();
//MessageBox.Show(httpResponse.ContentLength.ToString());
length = httpResponse.ContentLength;
this.progressBar1.Maximum = (int)length;
this.progressBar1.Minimum = 0;
downloadThread = new Thread(new ThreadStart(downloadFile));
//showThread = new Thread(new ThreadStart(show));
fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
downloadThread.Start();
this.timer1.Enabled = true;
// showThread.Start();
}
private void downloadFile()
{<!-- -->
ns = httpResponse.GetResponseStream();
int i;
UIDel = new updateData(updateUI);
while ((i = ns.Read(buffer, 0, buffer.Length)) > 0)
{<!-- -->
downlength += i;
string value = downlength.ToString();
this.Invoke(UIDel, value);
fs.Write(buffer, 0, i);
}
MessageBox.Show("下载完毕");
this.timer1.Enabled = false;
this.label3.BeginInvoke((Action)delegate{<!-- -->
this.label3.Text = (length / (1024 * totalseconds)) + "KB/s";
});
}
void updateUI(string value)
{<!-- -->
this.label1.Text = value;
this.progressBar1.Value = Int32.Parse(value);
}
private void timer1_Tick(object sender, EventArgs e)
{<!-- -->
}
private void timer1_Tick_1(object sender, EventArgs e)
{<!-- -->
this.label2.Text = ((downlength - lastlength) / 1024) + "KB/S";
lastlength = downlength;
totalseconds++;
}
}
}