string url = "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi";
参数1请求的路径,
参数2 HttpCompletionOption.ResponseHeadersRead 请求完成时候等待请求带什么程度才代表请求成功
ResponseHeadersRead 读取到响应头的时候算是请求完成, 响应头有个字段可以获取资源大小
ResponseContentRead 读取到整个响应内容算是请求完成
HttpResponseMessage res = await new HttpClient().GetAsync(url,HttpCompletionOption.ResponseHeadersRead);
string fileName = Path.GetFileName(url);
Stream stream = await res.Content.ReadAsStreamAsync();
long all = res.Content.Headers.ContentLength ?? 0;
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("下载完成");
HttpClientHandler handler = new HttpClientHandler();
2 创建下载进度的事件对象
ProgressMessageHandler pro = new ProgressMessageHandler(handler);
pro.HttpReceiveProgress += Pro_HttpReceiveProgress;
Pro_HttpReceiveProgress类
- private void Pro_HttpReceiveProgress(object sender, HttpProgressEventArgs e)
- {
- Console.WriteLine(e.ProgressPercentage);//记录当前的进度
- //Invoke调用一个方法
- this.Invoke((Action) (() =>
- {
- this.progressBar1.Value = e.ProgressPercentage;
- }));
- }
- HttpClient client = new HttpClient(pro);
- var res = await client.GetAsync("https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi");
- var stream = await res.Content.ReadAsStreamAsync();
- var fs = new FileStream("node.msi", FileMode.Create);
- fs.CopyTo(fs);
- fs.Close();
- stream.Close();