微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#限速下载网络文件

代码

using System;
 System.Collections.Concurrent;
 System.Collections.Generic;
 System.ComponentModel;
 System.Data;
 System.Drawing;
 System.IO;
 System.Linq;
 System.Net;
 System.Text;
 System.Text.RegularExpressions;
 System.Threading;
 System.Threading.Tasks;
 System.Windows.Forms;
 Common.Utils;
 Utils;

namespace 爬虫
{
    public partial class Form1 : Form
    {
        #region 变量
        /// <summary>
        /// 已完成字节数
        </summary>
        private long completedCount = 0;
         是否完成
        bool isCompleted = true 数据块队列
        private ConcurrentQueue<MemoryStream> msQueue = new ConcurrentQueue<MemoryStream>();
         下载开始位置
        long range =  文件大小
        long total =  一段时间内的完成节点数,计算网速用
        long unitCount =  上次计时时间,计算网速用
        private DateTime lastTime = DateTime.MinValue;
         一段时间内的完成字节数,控制网速用
        long unitCountForLimit =  上次计时时间,控制网速用
        private DateTime lastTimeForLimit = 下载文件sleep时间,控制速度用
        int sleepTime = 1;
        #endregion

        #region Form1
        public Form1()
        {
            InitializeComponent();
        }
        #region Form1_Load
        void Form1_Load(object sender,EventArgs e)
        {
            lblMsg.Text = string.Empty;
            lblByteMsg.Text = .Empty;
            lblSpeed.Text = .Empty;
        }
        #region Form1_FormClosing
        void Form1_FormClosing(#region btnDownload_Click 下载
        void btnDownload_Click(false;
            btnDownload.Enabled = ;
            string url = txtUrl.Text.Trim();
            string filePath = CreateFilePath(url);

            #region 下载线程
            Thread thread = new Thread(new ThreadStart(() =>
            {
                int tryTimes = ;
                while (!HttpDownloadFile(url,filePath))
                {
                    Thread.Sleep(10000);

                    tryTimes++;
                    LogUtil.Log("请求服务器失败,重新请求" + tryTimes.ToString() + ");
                    this.Invoke(new InvokeDelegate(() =>
                    {
                        lblMsg.Text = ;
                    }));
                    HttpDownloadFile(url,filePath);
                }
            }));
            thread.IsBackground = ;
            thread.Start();
            #endregion

            #region 保存文件线程
            thread = isCompleted)
                {
                    MemoryStream ms;
                    if (msQueue.TryDequeue(out ms))
                    {
                        using (FileStream fs = new FileStream(filePath,FileMode.Open,FileAccess.Write))
                        {
                            fs.Seek(completedCount,SeekOrigin.Begin);
                            fs.Write(ms.ToArray(),0,(int)ms.Length);
                            fs.Close();
                        }
                        completedCount += ms.Length;
                    }

                    if (total != 0 && total == completedCount)
                    {
                        Thread.Sleep(100);
                        isCompleted = ;
                    }

                    Thread.Sleep();
                }
            }));
            thread.IsBackground = #region 计算网速/进度线程isCompleted)
                {
                    Thread.Sleep(1000);

                    if (lastTime != DateTime.MinValue)
                    {
                        double sec = DateTime.Now.Subtract(lastTime).TotalSeconds;
                        double speed = unitCount / sec / 1024;

                        try
                        {
                            #region 显示速度
                            if (speed < )
                            {
                                
                                {
                                    lblSpeed.Text = string.Format({0}KB/S",speed.ToString(0.00));
                                }));
                            }
                            else
                            {
                                {0}MB/S1024).ToString(#endregion

                            #region 显示进度
                            string strTotal = (total / 1024 / ") + MB;
                                if (total < 1024 * )
                                {
                                    strTotal = (total / KB;
                                }
                                string completed = (completedCount / if (completedCount < )
                                {
                                    completed = (completedCount / ;
                                }
                                lblMsg.Text = 进度:{0}/{1},completed,strTotal);
                                lblByteMsg.Text = 已下载:{0}\r\n总大小:{1}if (completedCount == total)
                                {
                                    MessageBox.Show(完成);
                                }
                            }));
                            #endregion
                        }
                        catch { }

                        lastTime = DateTime.Now;
                        unitCount = ;
                    }
                }
            }));
            thread.IsBackground = #region 限制网速线程if (lastTimeForLimit != DateTime.Now.Subtract(lastTimeForLimit).TotalSeconds;
                        double speed = unitCountForLimit / sec / #region 限速/解除限速
                            double limitSpeed = ;
                            if (double.TryParse(txtSpeed.Text.Trim(), limitSpeed))
                            {
                                if (speed > limitSpeed && sleepTime < )
                                {
                                    sleepTime += if (speed < limitSpeed - 10 && sleepTime >= 2)
                                {
                                    sleepTime -= ;
                                }
                            }
                            
                                {
                                    txtSpeed.Text = 100;
                                }));
                            }
                             { }

                        lastTimeForLimit = DateTime.Now;
                        unitCountForLimit = 

        }
        #region HttpDownloadFile 下载文件
         Http下载文件
        bool HttpDownloadFile(string url,1)"> filePath)
        {
            if (!File.Exists(filePath))
                {
                    
                {
                    FileInfo fileInfo =  FileInfo(filePath);
                    range = fileInfo.Length;
                }

                // 设置参数
                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
                request.UserAgent = Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0);
                request.Proxy = null发送请求并获取相应回应数据
                HttpWebResponse response = request.GetResponse()  HttpWebResponse;
                if (response.ContentLength == range)
                {
                    文件已下载;
                    }));
                    return ;
                }

                 设置参数
                request = WebRequest.Create(url) ;
                request.AddRange(range);
                发送请求并获取相应回应数据
                response = request.GetResponse() 直到request.GetResponse()程序才开始向目标网页发送Post请求
                Stream responseStream = response.GetResponseStream();

                total = range + response.ContentLength;
                completedCount = range;

                MemoryStream ms =  MemoryStream();
                byte[] bArr = new byte[];
                lastTime = DateTime.Now;
                lastTimeForLimit = DateTime.Now;
                int size = responseStream.Read(bArr,)bArr.Length);
                unitCount += size;
                unitCountForLimit += size;
                ms.Write(bArr,size);
                isCompleted)
                {
                    size = responseStream.Read(bArr,1)">)bArr.Length);
                    unitCount += size;
                    unitCountForLimit += size;
                    ms.Write(bArr,size);
                    if (ms.Length > 102400)
                    {
                        msQueue.Enqueue(ms);
                        ms =  MemoryStream();
                    }
                    if (completedCount + ms.Length == total)
                    {
                        msQueue.Enqueue(ms);
                        ms =  MemoryStream();
                    }

                    Thread.Sleep(sleepTime);
                }
                responseStream.Close();
                ;
            }
             (Exception ex)
            {
                LogUtil.LogError(ex.Message + \r\n" + ex.StackTrace);
                ;
            }
        }
        #region 根据URL生成文件保存路径
        string CreateFilePath( url)
        {
            string path = Application.StartupPath + \\downloadDirectory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            string fileName = Path.GetFileName(url);
            if (fileName.IndexOf(?") > )
            {
                return path + \\" + fileName.Substring());
            }
             fileName;
            }
        }
        

    } end Form1类
}
View Code

测试截图:

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐