进度条控件:progressBar
第一种下载带进度的方法
①使用getASync获取服务器响应数据
string url = "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi";
HttpResponseMessage res = await new HttpClient().GetAsync(url,HttpCompletionOption.ResponseHeadersRead);
需要下载的视频或者图片的网址。
②获取url的文件名称
string fileName = Path.GetFileName(url);
③将响应数据读取带stream对象中
Stream stream = await res.Content.ReadAsStreamAsync();
④记录响应数据的总大小 在响应头里面有一个ContentLength字段获取响应大小也就是下载的总大小
//4 记录响应数据的总大小 在响应头里面有一个ContentLength字段获取响应大小也就是下载的总大小
long all = res.Content.Headers.ContentLength ?? 0;
// 5 创建文件流准备本地写入
long loadByte = 0; // 表示已经下载的大小
FileStream fs = new FileStream(fileName, FileMode.Create);
//6 定义一个字节数组 字节数组容量是8KB的大小
byte[] bytes = new byte[1024*8];
//从数据流读取到字节数组,并且从0开始读取,到字节数组被容纳完为止
// 返回值是整型的,代表是读取的位置
//stream.Read(bytes, 0, bytes.Length);
int nowReadCount = 0; //当前读取的位置
//如果读取的位置不为0,证明还有数据,还得再次读取数据
while((nowReadCount = stream.Read(bytes, 0, bytes.Length))!=0)
{
// 读取数据
//b把当前读取的数据写入本地
fs.Write(bytes, 0, nowReadCount);
loadByte += nowReadCount;// 记录总下载量
Console.WriteLine(loadByte);
//用已经下载量/总量 *100 转成百分制度。
double progress = (double)loadByte /(double) all * 100;
this.progressBar1.Value = (int)progress;
}
fs.Close();
MessageBox.Show("下载完成");
第二种方法安装第三方Microsoft.AspNet.WebApi.Client
//提供了一个下载事件,在事件函数可以获取下载进度
private async void button2_Click(object sender, EventArgs e)
{
// 1创建httpclientHandler 事件对象
HttpClientHandler handler = new HttpClientHandler();
//2 创建下载进度的事件对象
ProgressMessageHandler pro = new ProgressMessageHandler(handler);
//3 创建下载进度的事件函数
pro.HttpReceiveProgress += Pro_HttpReceiveProgress;
//4 创建请求对象并且发请求,获取响应 目的是为了通知下载进度对象,再触发对应的Pro_HttpReceiveProgress函数
HttpClient client = new HttpClient(pro);
var res = await client.GetAsync("https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi");
//5 读取响应数据写入本地
var stream = await res.Content.ReadAsStreamAsync();
var fs = new FileStream("node.msi", FileMode.Create);
fs.CopyTo(fs);
fs.Close();
stream.Close();
}
private void Pro_HttpReceiveProgress(object sender, HttpProgressEventArgs e)
{
Console.WriteLine(e.ProgressPercentage);//记录当前的进度
//Invoke调用一个方法
this.Invoke((Action) (() =>
{
this.progressBar1.Value = e.ProgressPercentage;
}));
}