最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Winform使用FTP實(shí)現(xiàn)自動(dòng)更新

 更新時(shí)間:2022年07月27日 15:03:05   作者:Mark_mwl  
這篇文章主要為大家詳細(xì)介紹了Winform使用FTP實(shí)現(xiàn)自動(dòng)更新,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Winform使用FTP實(shí)現(xiàn)自動(dòng)更新的具體代碼,供大家參考,具體內(nèi)容如下

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

1.判斷是否有新版本。

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

3.打開更新程序(批處理文件或可執(zhí)行文件)同時(shí)關(guān)閉所有主程序進(jìn)程。

4.在更新程序中進(jìn)行解壓、替換操作。

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

6.打開新程序同時(shí)關(guān)閉所有更新程序進(jìn)程。

代碼:

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

//判斷版本號(hào)是否為數(shù)據(jù)庫(kù)表的版本號(hào)
? if (edition == "2021.5.12.0.1")//版本號(hào)自己可以判斷
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var resulta = MessageBox.Show("有可用更新,是否更新?", "系統(tǒng)提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
? ? ? ? ? ? ? ? if (resulta == DialogResult.No)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? Application.Run(new Form1());
? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? //從服務(wù)器獲取新壓縮文件后下載至某一路徑
? ? ? ? ? ? ? ? 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, "系統(tǒng)提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
? ? ? ? ? ? ? ? ? ? if (result == DialogResult.Yes)
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? Application.Run(new Form1());
? ? ? ? ? ? ? ? ? ? ? ? return;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? //強(qiáng)制關(guān)閉進(jìn)程 ? ?
? ? ? ? ? ? ? ? ? ? ? ? var proc = System.Diagnostics.Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
? ? ? ? ? ? ? ? ? ? ? ? foreach (Process item in proc)
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? item.Kill();
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //替換程序文件(用一個(gè)update程序負(fù)責(zé)解壓程序并替換文件,在刪除壓縮文件)
? ? ? ? ? ? ? ? System.Diagnostics.Process.Start(Application.StartupPath + "\\Update\\" + "AutoUpdate.exe");
? ? ? ? ? ? ? ? //關(guān)閉當(dāng)前進(jìn)程 ??
? ? ? ? ? ? ? ? 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>
? ? ? ? /// 服務(wù)器IP
? ? ? ? /// </summary>
? ? ? ? public string IP { get; set; }
? ? ? ? /// <summary>
? ? ? ? /// 服務(wù)器文件和下載到本地文件名一致
? ? ? ? /// </summary>
? ? ? ? public string ServerFile { get; set; }
? ? ? ? /// <summary>
? ? ? ? /// 服務(wù)器用戶名
? ? ? ? /// </summary>
? ? ? ? public string User { get; set; }
? ? ? ? /// <summary>
? ? ? ? /// 服務(wù)器密碼
? ? ? ? /// </summary>
? ? ? ? public string Password { get; set; }
? ? ? ? /// <summary>
? ? ? ? /// 下載服務(wù)器文件
? ? ? ? /// </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 + "http://"+ ServerFile));
? ? ? ? ? ? ? ? reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;//指定當(dāng)前請(qǐng)求是什么命令(upload,download,filelist等)
? ? ? ? ? ? ? ? reqFTP.UseBinary = true;//指定文件傳輸?shù)念愋?
? ? ? ? ? ? ? ? reqFTP.Credentials = new NetworkCredential(User, Password); //指定登錄ftp服務(wù)器的用戶名和密碼。
? ? ? ? ? ? ? ? reqFTP.KeepAlive = false;//指定在請(qǐng)求完成之后是否關(guān)閉到 FTP 服務(wù)器的控制連接
? ? ? ? ? ? ? ? //reqFTP.UsePassive = true;//指定使用主動(dòng)模式還是被動(dòng)模式
? ? ? ? ? ? ? ? //reqFTP.Proxy = null;//設(shè)置不使用代理
? ? ? ? ? ? ? ? //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 + " 按是進(jìn)入原程序,按否關(guān)閉程序!";
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ?
? ? ? ? }
? ? }
}

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

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文件夾上一級(jí)主程序目錄中。
? ? ? ? ? ? IndexLoad = string.Join("\\",lis);
? ? ? ? ? ? //1.解壓臨時(shí)文件包到當(dāng)前路徑并刪除壓縮包
? ? ? ? ? ? if (System.IO.File.Exists(FileLoad))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? label1.Text = "正在解壓軟件更新包...";
? ? ? ? ? ? ? ? //存在就解壓
? ? ? ? ? ? ? ? if (!Decompression(FileLoad, IndexLoad, true))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? MessageBox.Show("解壓更新包失敗,請(qǐng)重試!", "系統(tǒng)提示");
? ? ? ? ? ? ? ? ? ? //關(guān)閉當(dāng)前進(jìn)程 ??
? ? ? ? ? ? ? ? ? ? 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("軟件更新包不存在,請(qǐng)重新打開程序以獲取更新包!", "系統(tǒng)提示");
? ? ? ? ? ? ? ? //關(guān)閉當(dāng)前進(jìn)程 ??
? ? ? ? ? ? ? ? foreach (System.Diagnostics.Process item in System.Diagnostics.Process.GetProcessesByName(System.Diagnostics.Process.GetCurrentProcess().ProcessName))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? item.Kill();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? label1.Text = "更新成功,請(qǐng)稍后...";
? ? ? ? ? ? //2.打開更新后程序
? ? ? ? ? ? System.Diagnostics.Process.Start(IndexLoad + "\\" + "OldDemo.exe");
? ? ? ? ? ? //關(guān)閉當(dāng)前進(jìn)程 ??
? ? ? ? ? ? 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/失?。篺alse</returns>
? ? ? ? public static bool Decompression(string strZipPath, string strUnZipPath, bool overWrite)
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ReadOptions options = new ReadOptions();
? ? ? ? ? ? ? ? options.Encoding = Encoding.Default;//設(shè)置編碼,解決解壓文件時(shí)中文亂碼
? ? ? ? ? ? ? ? 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.需要注意的幾個(gè)地方有:

4.1在主程序的生成目錄下創(chuàng)建一個(gè)文件夾Update;

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 算法基礎(chǔ)之算法設(shè)計(jì)與分析

    算法基礎(chǔ)之算法設(shè)計(jì)與分析

    這篇文章主要介紹了算法基礎(chǔ)之算法設(shè)計(jì)與分析,貪心算法是一種解決優(yōu)化問題的算法設(shè)計(jì)方法,其核心思想是在每一步選擇當(dāng)前狀態(tài)下的最優(yōu)解,從而希望最終達(dá)到全局最優(yōu)解,需要的朋友可以參考下
    2023-10-10
  • c# WPF設(shè)置軟件界面背景為MediaElement并播放視頻

    c# WPF設(shè)置軟件界面背景為MediaElement并播放視頻

    這篇文章主要介紹了c# WPF如何設(shè)置軟件界面背景為MediaElement并播放視頻,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#如何用ThoughtWorks生成二維碼

    C#如何用ThoughtWorks生成二維碼

    這篇文章主要介紹了C#如何用ThoughtWorks生成二維碼,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • C#將DataTable轉(zhuǎn)換成list的方法

    C#將DataTable轉(zhuǎn)換成list的方法

    這篇文章主要介紹了C#將DataTable轉(zhuǎn)換成list的方法,實(shí)例分析了DataTable轉(zhuǎn)換成list及數(shù)據(jù)分頁(yè)的技巧,需要的朋友可以參考下
    2015-01-01
  • C# WinForms中實(shí)現(xiàn)MD5的加密

    C# WinForms中實(shí)現(xiàn)MD5的加密

    MD5(消息摘要算法第5版)是一種廣泛使用的哈希函數(shù),可以生成一個(gè)128位(16字節(jié))的哈希值,通常用于數(shù)據(jù)完整性校驗(yàn)和密碼存儲(chǔ),在Windows Forms應(yīng)用程序中實(shí)現(xiàn)MD5加密,可以用于用戶密碼的安全存儲(chǔ)和數(shù)據(jù)的完整性驗(yàn)證,本文將詳細(xì)介紹了如何在WinForms中實(shí)現(xiàn)MD5加密
    2024-10-10
  • c#文件名/路徑處理方法示例

    c#文件名/路徑處理方法示例

    這篇文章主要介紹了c#文件名/路徑處理方法,大家寫代碼處理文件的時(shí)候會(huì)常用到
    2013-12-12
  • C#實(shí)現(xiàn)判斷當(dāng)前操作用戶管理角色的方法

    C#實(shí)現(xiàn)判斷當(dāng)前操作用戶管理角色的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)判斷當(dāng)前操作用戶管理角色的方法,涉及C#針對(duì)系統(tǒng)用戶判斷的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • C#:foreach與yield語(yǔ)句的介紹

    C#:foreach與yield語(yǔ)句的介紹

    C#:foreach與yield語(yǔ)句的介紹,需要的朋友可以參考一下
    2013-03-03
  • Unity3D使用右鍵菜單打開工程

    Unity3D使用右鍵菜單打開工程

    這篇文章主要為大家詳細(xì)介紹了Unity3D使用右鍵菜單打開工程的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#自定義緩存封裝類實(shí)例

    C#自定義緩存封裝類實(shí)例

    這篇文章主要介紹了C#自定義緩存封裝類,涉及C#針對(duì)緩存的寫入、讀取及設(shè)置過期時(shí)間等常用操作,并封裝進(jìn)一個(gè)類中便于調(diào)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

石柱| 房产| 曲靖市| 新乡市| 和顺县| 茌平县| 榆林市| 绥芬河市| 宜君县| 永登县| 屯门区| 道孚县| 东乌| 宾阳县| 奉化市| 江城| 黑水县| 建阳市| 彭水| 茌平县| 土默特右旗| 日喀则市| 巩留县| 乐山市| 黄浦区| 平乐县| 社会| 镇康县| 全椒县| 日喀则市| 绍兴市| 习水县| 班玛县| 盐山县| 湘潭县| 库尔勒市| 都江堰市| 阿克陶县| 武夷山市| 安顺市| 若尔盖县|