看到有人用 WebClient来下载, 发篇用 WebRequest 实现有进度下载的吧.

类别:.NET开发 点击:0 评论:0 推荐:
 

记得以前刚用的时候,webclient确实看着挺简单,但是实现起来,小文件是一下就下载完了.

大文件要一直下载完毕才行.

后来找了找,用 WebRequest 结合 WebResponse 可以实现 有进度提示的,下载文件..
下面是代码..是从我一个软件中提取出来的.只取关键部分说明...
=====================================================================
     if(Downloading==false) //如果无文件正在下载
     { 
      TempDown=CurrentFileName;
      if(CurrentFileName==""){TempDown=b;}
      WhichDown=1;
      System.Threading.Thread ApcThread2=new System.Threading.Thread(new System.Threading.ThreadStart(DownFile));
      ApcThread2.Start();
   
     }
     else
     {
      MessageBox.Show("对不起,当前正在下载文件.","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
     }      
##################
大概说明下,如果当前没有文件正在下载,则启动一个新线程....下载文件.. 下面是 DownFile函数的代码....
简单的地方就不做注释了.
=============================================================================
  //下载块#####################################################################################################
  private void DownFile()
  {
   if(TempDown!="")
   {
   
    if(Downloading==false) //如果无文件下载
    {
     long fb;
     this.apc_status_1.Text="正在连接到 " + TempDown;
     Downloading=true;
     try
     {
      //====尝试URL有效性,以及初始化下载界面
      WebRequest myre=WebRequest.Create(TempDown);
      WebResponse mwrite=myre.GetResponse();
      fb=mwrite.ContentLength;
      this.apc_status_1.Text="连接成功..开始下载..";
      pbar.Value=0;
      pbar.Maximum=(int)fb;
      pbar.Visible=true;
      this.ApcList.Height=156;
      //====开始下载
      WebClient wc=new WebClient();
      SaveFileDialog sf=new SaveFileDialog();
      sf.Title="请选择文件存放的位置";
      filename=CurrentFileName;
      sf.FileName=filename.Substring(filename.LastIndexOf("/")+1,filename.Length-filename.LastIndexOf("/")-1);
      sf.ShowDialog(this);
      filename=sf.FileName;
      if(filename!="")
      {
       Stream srm=wc.OpenRead(TempDown);
       StreamReader srmer=new StreamReader(srm);
       byte[] mbyte=new byte[fb];
       int allbyte=(int)mbyte.Length;
       int startbyte=0;
       while(fb>0)  //################   循环读取文件,并显示进度.....
       {
        Application.DoEvents();
        int m=srm.Read(mbyte,startbyte,allbyte);
        if(m==0){break;}
        startbyte+=m;
        allbyte-=m;
        pbar.Value+=m;
        int a1=(int)startbyte/1024;
        int a2=(int)fb/1024;
        this.apc_status_1.Text="连接成功..开始下载.." + a1.ToString() + "/" + a2.ToString() + "KB";//startbyte + "/" + fb.ToString();
       }

       FileStream fs = new FileStream(filename,FileMode.OpenOrCreate);
       fs.Write(mbyte,0,mbyte.Length);
       fs.Flush();


       srm.Close();
       srmer.Close();
       fs.Close();

       this.ApcList.Height=170;
       pbar.Visible=false;
       this.apc_status_1.Text="文件下载完毕!";
      }                     


     }
     catch(WebException exp) //如地址无效或者找不到文件
     {
      MessageBox.Show(exp.Message,"听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
     }
     Downloading=false;
    }
    else
    {
     MessageBox.Show("对不起,当前正在下载文件.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
   }
   else
   {
    if(WhichDown==1)
    {
     MessageBox.Show("当前并无文件播放.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
    else
    {
     MessageBox.Show("请在列表中选择好想要下载的文件.","听啪啪 提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
    }
   }
   
  }//下载块#####################################################################################################

本文地址:http://com.8s8s.com/it/it41314.htm