自己以前用C#写的简单升级程序源码(比如更新一个安装包或者压缩文件),带进度条,支持续传

本文提供了一个基于C#的应用程序示例,展示了如何实现文件的上传和下载功能,包括FTP上传、FTP下载以及HTTP下载,并支持断点续传和进度显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Diagnostics;
using System.Threading;

namespace WindowsApplication5
{
    public partial class updates : Form
    {
        private WebClient update = new WebClient();
        public updates()
        {
            InitializeComponent();
        }
        //上传文件基于FTP模式
        #region 上传文件
        public  void FtpUpFile(string ftpServerIP, string filename, ProgressBar Prog, string ftpUserID, string ftpPassword)
        {
            FileInfo fileInf = new FileInfo(filename);
            string uri = "ftp://" + ftpServerIP + "/" + fileInf.Name;
            FtpWebRequest reqFTP;

            // 根据uri创建FtpWebRequest对象
            reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileInf.Name));

            // ftp用户名和密码
            reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

            // 默认为true,连接不会被关闭
            // 在一个命令之后被执行
            reqFTP.KeepAlive = false;

            // 指定执行什么命令
            reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

            // 指定数据传输类型
            reqFTP.UseBinary = true;

            // 上传文件时通知服务器文件的大小
            reqFTP.ContentLength = fileInf.Length;
            Prog.Maximum =(int)fileInf.Length/1024;
            // 缓冲大小设置为2kb
            int buffLength = 2048;

            byte[] buff = new byte[buffLength];
            int contentLen;

            // 打开一个文件流 (System.IO.FileStream) 去读上传的文件
            FileStream fs = fileInf.OpenRead();
            try
            {
                // 把上传的文件写入流
                Stream strm = reqFTP.GetRequestStream();

                // 每次读文件流的2kb
                contentLen = fs.Read(buff, 0, buffLength);

                // 流内容没有结束
                while (contentLen != 0)
                {
                    // 把内容从file stream 写入 upload stream
                    strm.Write(buff, 0, contentLen);
                    Prog.Value +=2;
                    contentLen = fs.Read(buff, 0, buffLength);
                }

                // 关闭两个流
                strm.Close();
                fs.Close();
                //labelX1.Text = "程序上传完毕";
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Upload Error");
                labelX1.Text = "上传程序失败!";
            }


        }
        #endregion
        //下载文件基于ftp模式
        #region 下载文件ftp
        public  void FtpDownFile(string ftpServerIP, string fileName, ProgressBar Prog, string ftpUserID,string  ftpPassword)
        {
            FtpWebRequest reqFTP;

            try
            {
                FileStream outputStream = new FileStream(Application.StartupPath + "//update//" + fileName, FileMode.Create);

                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpServerIP + "/" + fileName));
                //reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://222.223.155.104//wwwroot/DeskHelper.asp"));


                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;

                reqFTP.UseBinary = true;

                reqFTP.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();

                Stream ftpStream = response.GetResponseStream();

                long cl = response.ContentLength;
                Prog.Maximum =(int) cl/1024;
                int bufferSize = 2048;

                int readCount;

                byte[] buffer = new byte[bufferSize];

                readCount = ftpStream.Read(buffer, 0, bufferSize);

                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    Prog.Value +=2 ;
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                labelX1.Text = "程序下载完毕";
                ftpStream.Close();

                outputStream.Close();

                response.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                labelX1.Text = "下载程序失败!";
            }

        }
        #endregion
        //下载进度http下载模式
        #region 下载文件http 进度条以及断点续传
        public static  void HttpDownFile(string URL, string Filename, ProgressBar Prog)
        {
           
     
            //////////////////////////////////////
            string StrFileName = Application.StartupPath + @"//update//" + Filename; //根据实际情况设置
            string StrUrl = URL; //根据实际情况设置

            //打开上次下载的文件或新建文件
            long lStartPos = 0;
            System.IO.FileStream fs;
            if (System.IO.File.Exists(StrFileName))
            {
                fs = System.IO.File.OpenWrite(StrFileName);
                lStartPos = fs.Length;
                fs.Seek(lStartPos, System.IO.SeekOrigin.Current); //移动文件流中的当前指针
                //MessageBox.Show("..");
            }
            else
            {
                fs = new System.IO.FileStream(StrFileName, System.IO.FileMode.Create);
                lStartPos = 0;
            }
            
            //打开网络连接
            try
            {
                ////////
                System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
                System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
                 long totalBytes;
                 if (myrp.ContentLength > 0)
                 {
                     totalBytes = myrp.ContentLength;
                 }
                 else
                 {
                     MessageBox.Show("连接服务器失败!请先确保网络连通再使用在线升级功能");
                     totalBytes = lStartPos;
                     
                 }
                ////////
                Prog.Maximum = (int)(totalBytes/512+1);
                Prog.Value = (int)(lStartPos/512);
                myrp.Close();
                //MessageBox.Show("..");
                ////////
                System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);
                //MessageBox.Show("..");
               // MessageBox.Show(".-1.");
                if (lStartPos >= 0 && lStartPos < totalBytes)
                {
                    //MessageBox.Show(".0.");
                    request.AddRange((int)lStartPos); //设置Range值

                    //向服务器请求,获得服务器回应数据流
                    System.IO.Stream ns = request.GetResponse().GetResponseStream();

                    byte[] nbytes = new byte[512];
                    int nReadSize = 0;
                    nReadSize = ns.Read(nbytes, 0, 512);
                    //MessageBox.Show(".1.");
                   
                    while (nReadSize > 0)
                    {
                        fs.Write(nbytes, 0, nReadSize);
                        nReadSize = ns.Read(nbytes, 0, 512);
                        Prog.Value=Prog.Value+1;
                    }
                    Prog.Value = Prog.Maximum;
                    fs.Close();
                    ns.Close();
                }
                
                //Console.WriteLine("下载完成");
            }
            catch (Exception ex)
            {
                
                MessageBox.Show("下载过程中出现错误:" + ex.Message);
                fs.Close();
                
            }
            //////////////////////////////////
            //  System.Net.HttpWebRequest Myrq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(URL);
            //  System.Net.HttpWebResponse myrp = (System.Net.HttpWebResponse)Myrq.GetResponse();
            //  long totalBytes = myrp.ContentLength;
            //  Prog.Maximum = (int)totalBytes;
                
            //  long totalDownloadedByte = 0;
            //  System.IO.Stream st = myrp.GetResponseStream();
            //  System.IO.Stream so = new System.IO.FileStream(@"update//" + Filename, System.IO.FileMode.Create);
            //try
            //{

               
            //    byte[] by = new byte[1024];
            //    int osize = st.Read(by, 0, (int)by.Length);
            //    while (osize > 0)
            //    {
            //        totalDownloadedByte = osize + totalDownloadedByte;
            //        Application.DoEvents();
            //        so.Write(by, 0, osize);
            //        Prog.Value = (int)totalDownloadedByte;
            //        osize = st.Read(by, 0, (int)by.Length);

            //    }
            //    //labelX1.Text = "程序下载完毕";
            //    so.Close();
            //    st.Close();
                
            //    myrp.Close();
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.Message); //labelX1.Text = "下载程序失败!";
            //    so.Close();
            //    st.Close();
            //    myrp.Close();
                
            //}
        }
        #endregion
        private void update_Load(object sender, EventArgs e)
        {
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            progressBar1.Visible = false;
            buttonX2.Enabled = false;
            buttonX1.Visible = true;
            buttonX1.Enabled = true;
            buttonX1.Text = "更新";
            labelX1.Visible = false;
            textBoxX2.Visible = false;
            textBoxX1.Text = "http://p.thec.cn/andyhebear/DeskHelper.rar";
        
        }
        private void buttonX1_Click2(object sender, EventArgs e)
        {
            //
            Thread thread = new Thread(new ThreadStart(buttonX1_Click));
            thread.IsBackground = true;
            thread.Start();
            /* 解决跨线程访问问题:
             *1, 在Form Load事件中加入
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
            是最简单的方式,但是代价是程序的不安全性
             * 正确方法是:
             * UI上的控件不是线程安全的,所以跨线程的操作UI控件需要通过Invoke的方式:
                private object m_SyncObjectForListBox = new object();
                private void UpdateListBox(ListBox control, string text)
                {
                if (control.InvokeRequired)
                {
                SetTextCallback d = new SetTextCallback(UpdateListBox);
                this.Invoke(d, new object[] { control, text });
                }
                else
                {
                lock (m_SyncObjectForListBox)
                {
                    control.Items.Add(text);
                }
            }
            }
             * 例如(据说也可以使用委托关键字 Delegate)
             * listBox1.Items.Add("主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听..../r/n");
                改为调用上面的方法:
                UpdateListBox(listBox1, "主机" + textBox1.Text + "端口" + textBox2.Text + "开始监听..../r/n");
             */
        }
        private void buttonX1_Click()
        {
           
            labelX1.Visible = true;
            
            buttonX1.Enabled = false;
            labelX1.Text = "程序更新中……请不要关闭程序!";
            string URL = @textBoxX1.Text;
            int n = URL.LastIndexOf('/');
            string fileName = URL.Substring(n + 1, URL.Length - n - 1);
            string url = URL.Substring(0,n-1);
            //MessageBox.Show("..");
            if (!(Directory.Exists(Application.StartupPath + "//update")))
            {
                Directory.CreateDirectory(Application.StartupPath + "//update");
            }
           // MessageBox.Show("..");
            //string file1=Application.StartupPath+"//update//DeskHelper";
            //string file2 = Application.StartupPath + "//" + fileName;
            try
            {
                //update.DownloadFile(URL, Application.StartupPath + "//update//" + fileName);
                //HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(URL);
               // HttpWebResponse myRes = (HttpWebResponse)myReq.GetResponse();
                // progressBarX1.Maximum = myRes.ContentLength;
                // progressBarX1.Minimum = 0;
                //progressBarX1.Value;
               // labelX1.Visible = true;
                progressBar1.Visible = true;
               // string ftpUserID="andyhebear";
                //string ftpPassword="19821210";
                
                //FtpDownFile(url, fileName, progressBar1, ftpUserID, ftpPassword);
               
                
                HttpDownFile(URL, fileName, progressBar1);  
               

               // myRes.Close();

            }
            catch (WebException ex) { MessageBox.Show(ex.Message, "Error"); labelX1.Text = "下载程序失败!"; }

            try
            {
                if (File.Exists(Application.StartupPath + "//update//" + fileName))
                {
                    //
                    
                    //File.Move(Application.StartupPath + "//update//" + fileName, Application.StartupPath + "//update//DeskHelper.rar" );
                    Process UnWinrar = new Process();
                    UnWinrar.StartInfo.FileName = "WinRAR.exe";
                    UnWinrar.StartInfo.Arguments = "e -o+ /"" + Application.StartupPath + "//update//" + fileName + "/"" + " /"" + Application.StartupPath + "//update" + "/"";
                    UnWinrar.Start();
                    MessageBox.Show("解压缩完成!");
                    //File.Copy(Application.StartupPath + "//update//" + "DeskHelper.exe", Application.StartupPath + "//DeskHelper", true);
                    //File.Copy(Application.StartupPath + "//update//" + "DeskHelper.vshost.exe", Application.StartupPath + "//DeskHelper.vshost.exe", true);
                    Process ProZhongwen = new Process();
                    ProZhongwen.StartInfo.FileName = Application.StartupPath + "//update//setup.exe";
                    ProZhongwen.Start();
                    labelX1.Text = "程序更新完毕";
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
          
            buttonX2.Enabled = true;
            
            //this.Close();
        }

        private void buttonX2_Click(object sender, EventArgs e)
        {
            this.Close();
            this.Dispose();
        }

        private void buttonX3_Click(object sender, EventArgs e)
        {
            textBoxX2.Visible = true;
            if (textBoxX2.Text == "Rains")
                textBoxX1.Visible = true;
            else
            { textBoxX1.Visible = false; }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rains卍Soft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值