第一種下載帶進度的方法
string url = "https://nodejs.org/dist/v20.10.0/node-v20.10.0-x64.msi";
1使用getASync獲取服務器響應數據
參數1請求的路徑,
? ? ? ? ? ? 參數2 HttpCompletionOption.ResponseHeadersRead 請求完成時候等待請求帶什么程度才代表請求成功
? ? ? ? ? ? ResponseHeadersRead 讀取到響應頭的時候算是請求完成, 響應頭有個字段可以獲取資源大小
? ? ? ? ? ? ResponseContentRead 讀取到整個響應內容算是請求完成
HttpResponseMessage res = await new HttpClient().GetAsync(url,HttpCompletionOption.ResponseHeadersRead);
2 獲取url的文件名稱
string fileName = Path.GetFileName(url);
3 將響應數據讀取帶stream對象中
Stream stream = await res.Content.ReadAsStreamAsync();
4 記錄響應數據的總大小 在響應頭里面有一個ContentLength字段獲取響應大小也就是下載的總大小
long all = res.Content.Headers.ContentLength ?? 0;
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,
提供了一個下載事件,在事件函數可以獲取下載進度
1創建httpclientHandler 事件對象
HttpClientHandler handler = new HttpClientHandler();
2 創建下載進度的事件對象
ProgressMessageHandler pro = new ProgressMessageHandler(handler);
3 創建下載進度的事件函數
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;}));
}
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();