http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 8838|回复: 8

[其他] C#编写软件下载程序,断网后重新连,还能在断点下载,或者是重新下载。

[复制链接]
发表于 2013-7-13 13:51:05 | 显示全部楼层 |阅读模式
本帖最后由 似水彪心 于 2013-7-13 13:52 编辑

的程序可以实现断点续传,前提是网不断,关闭软件后再打开可以实现。目前的问题是下载过程中断了网,再重新连,不会继续下载,而且卡在那里。我是新手一个,不知怎么处理断网重连的问题。求高手修改我的程序。。。   我主要用了HttpWebRequest 和HttpWebResponse

我程序运行界面










1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
 楼主| 发表于 2013-7-13 13:57:21 | 显示全部楼层
我程序主要代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Net.NetworkInformation;
using System.Net;
using System.Threading;

namespace AutoUpdateSetupClient
{
    public partial class UpdateMainForm : Form
    {
        public UpdateMainForm()
        {
            InitializeComponent();
        }




        /// <summary>        
        /// c#,.net 下载文件        
        /// </summary>        
        /// <param name="url">下载文件地址</param>      
        ///
        /// <param name="filename">下载后的文件名</param>        
        /// <param name="Prog">用于显示的进度条</param>        
        ///
        public void DownloadFile(string url, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
        {

            
                long lStartPos = 0;
                System.IO.FileStream fileModeCreate;
                try
                {
                    float percent = 0;

                    System.Net.HttpWebRequest myrq1 = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);

                    System.Net.HttpWebResponse myrp1 = (System.Net.HttpWebResponse)myrq1.GetResponse();

                    long totalBytes1 = myrp1.ContentLength;  //总文件大小

                    if (System.IO.File.Exists(filename))
                    {

                        fileModeCreate = System.IO.File.OpenWrite(filename);
                        lStartPos = fileModeCreate.Length;
                        if (lStartPos < totalBytes1)
                        {
                            fileModeCreate.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
                        }

                        else
                        {
                            fileModeCreate.Close();
                            fileModeCreate = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                            lStartPos = 0;
                        }
                    }
                    else
                    {
                        fileModeCreate = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                        lStartPos = 0;
                    }

                    System.Net.HttpWebRequest myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);

                    if (lStartPos > 0 && lStartPos < totalBytes1)
                        myrq.AddRange((int)lStartPos); //设置Range值

                    System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)myrq.GetResponse();

                    long totalBytes = lStartPos + myrp.ContentLength;  //已下载的文件大小+请求到的剩余文件大小

                    if (prog != null)
                    {
                        prog.Maximum = (int)totalBytes;
                    }
                    System.IO.Stream getResponseStream = myrp.GetResponseStream();

                    long totalDownloadedByte = lStartPos;
                    byte[] fileByte = new byte[1024];
                    int osize = getResponseStream.Read(fileByte, 0, (int)fileByte.Length);

                    try
                    {
                        while (osize > 0)
                        {

                            totalDownloadedByte = osize + totalDownloadedByte;
                            System.Windows.Forms.Application.DoEvents();

                            fileModeCreate.Write(fileByte, 0, osize);

                            if (prog != null)
                            {
                                prog.Value = (int)totalDownloadedByte;
                            }

                            osize = getResponseStream.Read(fileByte, 0, (int)fileByte.Length);
                            percent = (float)totalDownloadedByte / (float)totalBytes * 100;
                            label1.Text = "当前补丁下载进度" + percent.ToString() + "%";
                            System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息                  
                        }
                    }

                    catch (System.Exception ex)
                    {

                        label错误信息.Text = "下载过程中出现错误,请重新启动程序:" + ex.ToString();

                        fileModeCreate.Close();
                        getResponseStream.Close();


                        DownloadFile(url, filename, progressBar进度条, label进度条显示);
                        
                    }


                    fileModeCreate.Close();
                    getResponseStream.Close();
                    Application.Exit(); //退出

                }

                catch (System.Exception ex)
                {

                    label错误信息.Text = "网络连接错误,请重新启动程序:" + ex.ToString();
         
                    DownloadFile(url, filename, progressBar进度条, label进度条显示);

                }
            
        }

        private void UpdateMainForm_Shown(object sender, EventArgs e)
        {
            StreamReader reader = new StreamReader(System.Windows.Forms.Application.StartupPath + "\\UpdateFileList.txt");
            string url = reader.ReadLine();
            reader = new StreamReader(System.Windows.Forms.Application.StartupPath + "\\SetupExe.txt");
            string afterFilename = System.Windows.Forms.Application.StartupPath + "\\" + reader.ReadLine();
            System.Windows.Forms.Application.DoEvents();    //
            DownloadFile(url, afterFilename, progressBar进度条, label进度条显示);
        }


        private void UpdateMainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            System.Environment.Exit(System.Environment.ExitCode);

            this.Dispose();

            this.Close();
        }

    }
}
发表于 2013-7-15 08:31:34 | 显示全部楼层
你先调试一下看是那里卡的,看看是传文件 ,还是请求URl时出现卡的情况。
 楼主| 发表于 2013-7-15 09:54:20 | 显示全部楼层
好的
回复

使用道具 举报

 楼主| 发表于 2013-7-18 17:50:28 | 显示全部楼层
站长苏飞 发表于 2013-7-15 08:31
你先调试一下看是那里卡的,看看是传文件 ,还是请求URl时出现卡的情况。

是请求url的时候出现卡,怎么办呢?
 楼主| 发表于 2013-7-19 17:14:01 | 显示全部楼层
站长苏飞 发表于 2013-7-15 08:31
你先调试一下看是那里卡的,看看是传文件 ,还是请求URl时出现卡的情况。

慢慢调试,基本上实现功能了,多谢飞哥。

修改后代码如下:
[code=csharp]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.InteropServices;
using System.Net.NetworkInformation;
using System.Net;
using System.Threading;

namespace AutoUpdateSetupClient
{
    public partial class UpdateMainForm : Form
    {
        public UpdateMainForm()
        {
            InitializeComponent();
        }

        /// <summary>        
        /// c#,.net 下载文件        
        /// </summary>        
        /// <param name="url">下载文件地址</param>      
        ///
        /// <param name="filename">下载后的文件名</param>        
        /// <param name="Prog">用于显示的进度条</param>        
        ///
        public void DownloadFile(string url, string filename, System.Windows.Forms.ProgressBar prog, System.Windows.Forms.Label label1)
        {

            
                long lStartPos = 0;
                float percent = 0;
               
                System.IO.FileStream fileModeCreate;

                if (System.IO.File.Exists(filename))
                {
                    fileModeCreate = System.IO.File.OpenWrite(filename);
                    lStartPos = fileModeCreate.Length;
                    fileModeCreate.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
                }
                else
                {
                    fileModeCreate = new System.IO.FileStream(filename, System.IO.FileMode.Create);
                    lStartPos = 0;
                }

                try
                {
                    System.Net.HttpWebRequest myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url);
                    myrq.Timeout = 2000;
                    if (lStartPos > 0)
                        myrq.AddRange((int)lStartPos); //设置Range值

                    System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)myrq.GetResponse();

                    label错误信息.Text = "";

                    long totalBytes = lStartPos + myrp.ContentLength;  //已下载的文件大小+请求到的剩余文件大小

                    if (prog != null)
                    {
                        prog.Maximum = (int)totalBytes;
                    }
                    System.IO.Stream getResponseStream = myrp.GetResponseStream();

                    long totalDownloadedByte = lStartPos;
                    byte[] fileByte = new byte[1024];
                    int osize = getResponseStream.Read(fileByte, 0, (int)fileByte.Length);
                    
                        while (osize > 0)
                        {

                            totalDownloadedByte = osize + totalDownloadedByte;
                            System.Windows.Forms.Application.DoEvents();

                            //将收到的流写入文件
                            fileModeCreate.Write(fileByte, 0, osize);

                            if (prog != null)
                            {
                                prog.Value = (int)totalDownloadedByte;
                            }

                            //读取流
                            osize = getResponseStream.Read(fileByte, 0, (int)fileByte.Length);

                           

                            //显示进度条百分比
                            percent = (float)totalDownloadedByte / (float)totalBytes * 100;
                            label1.Text = "当前补丁下载进度" + percent.ToString() + "%";

                            System.Windows.Forms.Application.DoEvents(); //必须加注这句代码,否则label1将因为循环执行太快而来不及显示信息                  
                        }
         
                    fileModeCreate.Close();
                    getResponseStream.Close();
                  
                    Application.Exit(); //退出

                }
                     
                 catch (System.Exception ex)
                {
                  
                    fileModeCreate.Close();
               
                    Thread.Sleep(1000);

                    

                    System.Windows.Forms.Application.DoEvents();
                    label错误信息.Text = "网络错误:" + ex.Message.ToString();

                    if (ex.Message.Contains("416")) { File.Delete(filename); } //其实这里文件已经存在了,暂时这么处理:删掉重下
         
                    DownloadFile(url, filename, progressBar进度条, label进度条显示);
                    

                }
            
        }

        private void UpdateMainForm_Shown(object sender, EventArgs e)
        {
            StreamReader reader = new StreamReader(System.Windows.Forms.Application.StartupPath + "\\UpdateFileList.txt");
            string url = reader.ReadLine();
            reader = new StreamReader(System.Windows.Forms.Application.StartupPath + "\\SetupExe.txt");
            string afterFilename = System.Windows.Forms.Application.StartupPath + "\\" + reader.ReadLine();
            System.Windows.Forms.Application.DoEvents();    //
            DownloadFile(url, afterFilename, progressBar进度条, label进度条显示);
        }


        //关闭窗口退出所有进程
        private void UpdateMainForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            System.Environment.Exit(System.Environment.ExitCode);

            this.Dispose();

            this.Close();
        }
    }
}
[/code]

发表于 2013-7-19 19:20:40 | 显示全部楼层
似水彪心 发表于 2013-7-19 17:14
慢慢调试,基本上实现功能了,多谢飞哥。

修改后代码如下:

挺好的不错,
发表于 2013-8-21 09:11:02 | 显示全部楼层
正要这个代码 我来借鉴一下了
发表于 2016-1-25 18:08:53 | 显示全部楼层
不错,好东东,我也来学习下。
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-23 19:00

© 2014-2021

快速回复 返回顶部 返回列表