中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Winform怎么使用FTP實現自動更新

發布時間:2022-07-27 17:25:29 來源:億速云 閱讀:228 作者:iii 欄目:開發技術

這篇文章主要介紹“Winform怎么使用FTP實現自動更新”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Winform怎么使用FTP實現自動更新”文章能幫助大家解決問題。

實現思路:在主程序打開前實現判斷是否需要更新(可以通過數據庫表記錄一下版本號或者別的方式記錄是否需要更新),若需要更新時從ftp站點下載更新包(關于配置ftp站點自己可以搜這里不再做詳述)。自己可以制定后綴格式的包或者別的!一般用壓縮包的形式來存放最新程序,將文件下載到本地路徑,在關閉當前程序打開更新程序做解壓替換文件操作,或者可以用批處理文、可執行文件來做操作都行!

1.判斷是否有新版本。

2.通過ftp將更新包下載至本地路徑。

3.打開更新程序(批處理文件或可執行文件)同時關閉所有主程序進程。

4.在更新程序中進行解壓、替換操作。

5.待替換完畢刪除本地更新包(可選)。

6.打開新程序同時關閉所有更新程序進程。

代碼:

1.在程序入口處Program.cs中做判斷:

//判斷版本號是否為數據庫表的版本號
  if (edition == "2021.5.12.0.1")//版本號自己可以判斷
            {
                var resulta = MessageBox.Show("有可用更新,是否更新?", "系統提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (resulta == DialogResult.No)
                {
                    Application.Run(new Form1());
                    return;
                }
               
                //從服務器獲取新壓縮文件后下載至某一路徑
                UpdatateHelp help = new UpdatateHelp();//更新類
                help.IP = "xxx.xx.xx.xxx";
                help.ServerFile = "OldDemoUpd.zip";
                help.User = "Administrator";
                help.Password = "*****";
                string message = string.Empty;
                if (!help.DownloadFile(out message))
                {
                    var result = MessageBox.Show(message, "系統提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
                    if (result == DialogResult.Yes)
                    {
                        Application.Run(new Form1());
                        return;
                    }
                    else
                    {
                        //強制關閉進程    
                        var proc = System.Diagnostics.Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
                        foreach (Process item in proc)
                        {
                            item.Kill();
                        }
                    }
                }
                //替換程序文件(用一個update程序負責解壓程序并替換文件,在刪除壓縮文件)
                System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\" + "AutoUpdate.exe");
                //關閉當前進程   
                foreach (Process item in System.Diagnostics.Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName))
                {
                    item.Kill();
                }
            }

2.更新幫助類UpdatateHelp

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;

namespace OldDemo
{
    class UpdatateHelp
    {
        /// <summary>
        /// 服務器IP
        /// </summary>
        public string IP { get; set; }
        /// <summary>
        /// 服務器文件和下載到本地文件名一致
        /// </summary>
        public string ServerFile { get; set; }
        /// <summary>
        /// 服務器用戶名
        /// </summary>
        public string User { get; set; }
        /// <summary>
        /// 服務器密碼
        /// </summary>
        public string Password { get; set; }
        /// <summary>
        /// 下載服務器文件
        /// </summary>
        /// <param name="Message">返回信息</param>
        /// <returns></returns>
        public bool DownloadFile(out string Message)
        {
            FtpWebRequest reqFTP;
            try
            {
                FileStream outputStream = new FileStream(Path.GetTempPath()+ ServerFile, FileMode.Create);//本地緩存目錄
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + IP + "//"+ ServerFile));
                reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;//指定當前請求是什么命令(upload,download,filelist等)
                reqFTP.UseBinary = true;//指定文件傳輸的類型
                reqFTP.Credentials = new NetworkCredential(User, Password); //指定登錄ftp服務器的用戶名和密碼。
                reqFTP.KeepAlive = false;//指定在請求完成之后是否關閉到 FTP 服務器的控制連接
                //reqFTP.UsePassive = true;//指定使用主動模式還是被動模式
                //reqFTP.Proxy = null;//設置不使用代理
                //reqFTP.Timeout = 3000;
                FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
                Stream ftpStream = response.GetResponseStream();
                long cl = response.ContentLength;
                int bufferSize = 2048;
                int readCount;
                byte[] buffer = new byte[bufferSize];
                readCount = ftpStream.Read(buffer, 0, bufferSize);
                while (readCount > 0)
                {
                    outputStream.Write(buffer, 0, readCount);
                    readCount = ftpStream.Read(buffer, 0, bufferSize);
                }
                ftpStream.Close();
                outputStream.Close();
                response.Close();
                Message = "下載更新文件成功!";
                return true;
            }
            catch (Exception ex)
            {
                Message = "下載更新文件失敗!原因:"+ex.Message + " 按是進入原程序,按否關閉程序!";
                return false;
            }
           
        }
    }
}

3.關閉主程序進程打開更新程序AutoUpdate.exe,可以在Program中執行也可以在程序中新建一個窗體顯示進度條等!此處用Form1窗體來做解壓處理,需要注意的地方是我引用了using Ionic.Zip;可以在Nuget下搜一下DotNetZip,該dll是針對文件解壓縮幫助類,此只是例舉解壓,有興趣自己研究別的實現!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using Ionic.Zip;

namespace AutoUpdate
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();  
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            StartUpdate();
        }
        void StartUpdate()
        {
            string FileLoad = System.IO.Path.GetTempPath() + "OldDemoUpd.zip";
            string IndexLoad = Application.StartupPath + "\\";
            var lis = IndexLoad.Split('\\').ToList();
            lis.Remove("");
            lis.Remove("Update");//由于更新程序沒和主程序目錄同步,所以需要返回到Update文件夾上一級主程序目錄中。
            IndexLoad = string.Join("\\",lis);
            //1.解壓臨時文件包到當前路徑并刪除壓縮包
            if (System.IO.File.Exists(FileLoad))
            {
                label1.Text = "正在解壓軟件更新包...";
                //存在就解壓
                if (!Decompression(FileLoad, IndexLoad, true))
                {
                    MessageBox.Show("解壓更新包失敗,請重試!", "系統提示");
                    //關閉當前進程   
                    foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
                    {
                        item.Kill();
                    }
                }
                label1.Text = "正在刪除軟件更新包...";
                //刪除壓縮包
                System.IO.File.Delete(FileLoad);
            }
            else
            {
                MessageBox.Show("軟件更新包不存在,請重新打開程序以獲取更新包!", "系統提示");
                //關閉當前進程   
                foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
                {
                    item.Kill();
                }
            }
            label1.Text = "更新成功,請稍后...";
            //2.打開更新后程序
            System.Diagnostics.Process.Start(IndexLoad + "\\" + "OldDemo.exe");
            //關閉當前進程   
            foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
            {
                item.Kill();
            }
        }

        /// <summary>
        /// 解壓ZIP文件
        /// </summary>
        /// <param name="strZipPath">待解壓的ZIP文件</param>
        /// <param name="strUnZipPath">解壓的目錄</param>
        /// <param name="overWrite">是否覆蓋</param>
        /// <returns>成功:true/失敗:false</returns>
        public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
        {
            try
            {
                ReadOptions options = new ReadOptions();
                options.Encoding = Encoding.Default;//設置編碼,解決解壓文件時中文亂碼
                using (ZipFile zip = ZipFile.Read(strZipPath, options))
                {
                    foreach (ZipEntry entry in zip)
                    {
                        if (string.IsNullOrEmpty(strUnZipPath))
                        {
                            strUnZipPath = strZipPath.Split('.').First();
                        }
                        if (overWrite)
                        {
                            entry.Extract(strUnZipPath, ExtractExistingFileAction.OverwriteSilently);//解壓文件,如果已存在就覆蓋
                        }
                        else
                        {
                            entry.Extract(strUnZipPath, ExtractExistingFileAction.DoNotOverwrite);//解壓文件,如果已存在不覆蓋
                        }
                    }
                    return true;
                }
            }
            catch (Exception)
            {
                return false;
            }
        }
    }
}

4.需要注意的幾個地方有:

4.1在主程序的生成目錄下創建一個文件夾Update;

4.2把更新程序的生成文件放入Update文件夾下邊,主要是主程序Program中這一段(主程序目錄和更新目錄不是同級):

//替換程序文件(用一個update程序負責解壓程序并替換文件,在刪除壓縮文件)
 System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\" + "AutoUpdate.exe");

關于“Winform怎么使用FTP實現自動更新”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

静宁县| 同德县| 桃源县| 夏邑县| 习水县| 日土县| 苍山县| 乌拉特中旗| 乃东县| 德安县| 乌海市| 茂名市| 额敏县| 荥阳市| 威远县| 唐山市| 安丘市| 保康县| 华蓥市| 乐亭县| 灌云县| 绥棱县| 泰顺县| 奉贤区| 黑河市| 兰考县| 清河县| 乌鲁木齐县| 通辽市| 温泉县| 日喀则市| 五华县| 淮安市| 集贤县| 南宫市| 科技| 甘谷县| 原阳县| 湟中县| 三台县| 万全县|