zoukankan      html  css  js  c++  java
  • 关于文件的切割下载

      1 public class Program
      2     {
      3         public static CountdownEvent cde = new CountdownEvent(0);
      4 
      5         //每个线程下载的字节数,方便最后合并
      6         public static ConcurrentDictionary<long, byte[]> dic = new ConcurrentDictionary<long, byte[]>();
      7 
      8         //请求文件
      9         public static string url = "http://www.pncity.net/bbs/data/attachment/forum/201107/30/1901108yyd8gnrs2isadrr.jpg";
     10 
     11         static void Main(string[] args)
     12         {
     13             for (int i = 0; i < 5; i++)
     14             {
     15                 Console.WriteLine("
    ****************************
    第{0}次比较
    ****************************", (i + 1));
     16 
     17                 //不用线程
     18                 //RunSingle();
     19 
     20                 //使用多线程
     21                 RunMultiTask();
     22             }
     23 
     24             Console.Read();
     25         }
     26 
     27         static void RunMultiTask()
     28         {
     29             Stopwatch watch = Stopwatch.StartNew();
     30 
     31             //开5个线程
     32             int threadCount = 5;
     33 
     34             long start = 0;
     35 
     36             long end = 0;
     37 
     38             var total = GetSourceHead();
     39 
     40             if (total == 0)
     41                 return;
     42 
     43             var pageSize = (int)Math.Ceiling((Double)total / threadCount);
     44 
     45            // cde.Reset(threadCount);
     46 
     47             Task[] tasks = new Task[threadCount];
     48 
     49             for (int i = 0; i < threadCount; i++)
     50             {
     51                 start = i * pageSize;
     52 
     53                 end = (i + 1) * pageSize - 1;
     54 
     55                 if (end > total)
     56                     end = total;
     57 
     58                 var obj = start + "|" + end;
     59 
     60                 tasks[i] = Task.Factory.StartNew(j => new DownFile().DownTaskMulti(obj), obj);
     61             }
     62 
     63             Task.WaitAll(tasks);
     64 
     65             var targetFile = "C://down//" + url.Substring(url.LastIndexOf('/') + 1);
     66 
     67             FileStream fs = new FileStream(targetFile, FileMode.Create);
     68 
     69             var result = dic.Keys.OrderBy(i => i).ToList();
     70 
     71             foreach (var item in result)
     72             {
     73                 fs.Write(dic[item], 0, dic[item].Length);
     74             }
     75 
     76             fs.Close();
     77 
     78             watch.Stop();
     79 
     80             Console.WriteLine("多线程:下载耗费时间:{0}", watch.Elapsed);
     81         }
     82 
     83         static void RunSingle()
     84         {
     85             Stopwatch watch = Stopwatch.StartNew();
     86 
     87             if (GetSourceHead() == 0)
     88                 return;
     89 
     90             var request = (HttpWebRequest)HttpWebRequest.Create(url);
     91 
     92             var response = (HttpWebResponse)request.GetResponse();
     93 
     94             var stream = response.GetResponseStream();
     95 
     96             var outStream = new MemoryStream();
     97 
     98             var bytes = new byte[10240];
     99 
    100             int count = 0;
    101 
    102             while ((count = stream.Read(bytes, 0, bytes.Length)) != 0)
    103             {
    104                 outStream.Write(bytes, 0, count);
    105             }
    106 
    107             var targetFile = "C://down//" + url.Substring(url.LastIndexOf('/') + 1);
    108 
    109             FileStream fs = new FileStream(targetFile, FileMode.Create);
    110 
    111             fs.Write(outStream.ToArray(), 0, (int)outStream.Length);
    112 
    113             outStream.Close();
    114 
    115             response.Close();
    116 
    117             fs.Close();
    118 
    119             watch.Stop();
    120 
    121             Console.WriteLine("不用线程:下载耗费时间:{0}", watch.Elapsed);
    122         }
    123 
    124         //获取头信息
    125         public static long GetSourceHead()
    126         {
    127             var request = (HttpWebRequest)HttpWebRequest.Create(url);
    128 
    129             request.Method = "Head";
    130             request.Timeout = 3000;
    131 
    132             var response = (HttpWebResponse)request.GetResponse();
    133 
    134             var code = response.StatusCode;
    135 
    136             if (code != HttpStatusCode.OK)
    137             {
    138                 Console.WriteLine("下载的资源无效!");
    139                 return 0;
    140             }
    141 
    142             var total = response.ContentLength;
    143 
    144             Console.WriteLine("当前资源大小为:" + total);
    145 
    146             response.Close();
    147 
    148             return total;
    149         }
    150     }
    151 
    152     public class DownFile
    153     {
    154         // 多线程下载
    155         public void DownTaskMulti(object obj)
    156         {
    157             var single = obj.ToString().Split('|');
    158 
    159             long start = Convert.ToInt64(single.FirstOrDefault());
    160 
    161             long end = Convert.ToInt64(single.LastOrDefault());
    162 
    163             var request = (HttpWebRequest)HttpWebRequest.Create(Program.url);
    164 
    165             request.AddRange(start, end);
    166 
    167             var response = (HttpWebResponse)request.GetResponse();
    168 
    169             var stream = response.GetResponseStream();
    170 
    171             var outStream = new MemoryStream();
    172 
    173             var bytes = new byte[10240];
    174 
    175             int count = 0;
    176 
    177             while ((count = stream.Read(bytes, 0, bytes.Length)) != 0)
    178             {
    179                 outStream.Write(bytes, 0, count);
    180             }
    181 
    182             outStream.Close();
    183 
    184             response.Close();
    185 
    186             Program.dic.TryAdd(start, outStream.ToArray());
    187 
    188            // Program.cde.Signal();
    189         }
    190     }
    View Code
  • 相关阅读:
    Apollo与ROS
    QT windeployqt
    自定义QGraphicsItem
    ROS与C++
    aptitude与apt-get
    解决tcp粘包问题
    网络中两台主机通信
    I/O多路复用之select、poll、epoll
    Nginx命令行控制
    C++11
  • 原文地址:https://www.cnblogs.com/q975261413/p/5286358.html
Copyright © 2011-2022 走看看