C# 下載檔案 斷點續傳
阿新 • • 發佈:2020-12-23
/// <summary> /// 普通檔案下載 /// </summary> /// <param name="URL"></param> /// <param name="filename"></param> /// <returns></returns> public static bool DownloadFile(string URL, string filename) { try { HttpWebRequest webRequest= (HttpWebRequest)WebRequest.Create(URL); HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); Stream netFs = webResponse.GetResponseStream(); Stream fs = new FileStream(filename,FileMode.Create); byte[] by = new byte[1024]; int osize = netFs.Read(by, 0, (int)by.Length); while (osize > 0) { fs.Write(by, 0, osize); osize = netFs.Read(by, 0, (int)by.Length); } fs.Close(); netFs.Close(); webResponse.Close(); webRequest.Abort();return true; } catch (System.Exception e) { System.Console.WriteLine(e.ToString()); return false; } }
/// <summary> /// 斷點傳輸 /// </summary> /// <param name="URL"></param> /// <param name="filename"></param> /// <returns></returns> public static bool DownloadFile2(string URL, string filename) { StringBuilder progress = new StringBuilder(); int httpStatusCode = 200; //開啟上次下載的檔案或新建檔案 long lStartPos = 0; FileStream fs; if (File.Exists(filename))//另外如果檔案已經下載完畢,就不需要再斷點續傳了,不然請求的range 會不合法會丟擲異常。 { fs = File.OpenWrite(filename); lStartPos = fs.Length; fs.Seek(lStartPos, SeekOrigin.Current); //移動檔案流中的當前指標 } else { fs = new FileStream(filename, FileMode.Create); lStartPos = 0; } try { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); if (lStartPos > 0) { request.AddRange((int)lStartPos); //設定Range值 } WebResponse response = request.GetResponse(); //向伺服器請求,獲得伺服器迴應資料流 Stream netFs = response.GetResponseStream(); long totalSize = response.ContentLength; Console.WriteLine($"totalsize:{totalSize / 1024 / 1024}MB"); // 從lStartPos位置開始讀獲得的大小 long hasDownSize = 0; byte[] nbytes = new byte[512];//521,2048 etc int nReadSize = 0; nReadSize = netFs.Read(nbytes, 0, nbytes.Length); while (nReadSize > 0) { progress.Clear(); fs.Write(nbytes, 0, nReadSize); nReadSize = netFs.Read(nbytes, 0, nbytes.Length); hasDownSize += nReadSize; //progress.Append("("+(((double)hasDownSize * 100 / totalSize).ToString("0.00")) + " %)"); //Console.WriteLine(progress); } fs.Close(); netFs.Close(); return true; } catch (WebException ex) { var rsp = ex.Response as HttpWebResponse; httpStatusCode = (int)rsp.StatusCode; fs.Close(); if (httpStatusCode == 416) //request.AddRange((int)lStartPos) 超出範圍 { Console.WriteLine("檔案均下載完成"); return true; } else { Console.WriteLine("下載過程中出現錯誤:" + ex.ToString()); return false; } } }
使用例子: DownloadFile2("http://localhost//file//Windows Kits.rar", "Windows Kits.rar");