1. 程式人生 > 實用技巧 >C# 下載檔案 斷點續傳

C# 下載檔案 斷點續傳

        /// <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");