程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> [搜片神器]winform程序自己如何更新自己的方法代碼

[搜片神器]winform程序自己如何更新自己的方法代碼

編輯:C#入門知識

DHT抓取程序開源地址:https://github.com/h31h31/H31DHTDEMO

數據處理程序開源地址:https://github.com/h31h31/H31DHTMgr

國外測試服務器: http://h31bt.com 大家可以給提點意見...

--------------------------------------------------------------------------------------------------------------------

關於自動更新,在.NET下面已經是很普通的事情,無非就是在服務器端保存配置好要更新的程序,然後客戶端再寫一個小程序來檢測,有更新的則復制過來。

但現在問題是就一個程序,如何讓程序自己進行更新而不用調用另外的程序,對於用戶來說體驗更好.

1.首先程序exe自己下載覆蓋自己肯定是不行的,會報“當前程序正在被另一個進程所使用”的系統錯誤
2.在進程中的程序不能覆蓋自己,但是可以重命名,你從遠程下載一個新的exe文件,重命名為xxx.exe.tmp
3.待下載完畢後,把舊的exe重命名一下,比如xxx.exe.old,然後把新的xxx.exe.tmp重命名為xxx.exe
4.重命名的方法:System.IO.File.Move(filepath + ".tmp", filepath)
5.然後重啟程序Application.Restart()
if (System.IO.File.Exists(AppDomain.CurrentDomain.BaseDirectory + @"xxx.exe.old""xxx.exe.old")這樣就可以了,如果做的再好點的話,可以把xxx.exe.old的文件屬性設置為隱藏就好了.

網上搜索的方法: 

如果建一個bat文件,執行的是復制功能,然後再用一個bat來調用他,並且用一個bat文件去殺掉某一個文件,然後再復制新的,再啟動是沒有什麼問題的吧。

添加了一個方法KillSelfThenRun()用於刪除正在運行的主Exe,然後再重啟新的主Exe。代碼全部粘貼如下:

 

KillSelfThenRun
private void KillSelfThenRun()
{
string strXCopyFiles = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "XCopyFiles.bat");
using (StreamWriter swXcopy = File.CreateText(strXCopyFiles))
{
string strOriginalPath = tempUpdatePath.Substring(0, tempUpdatePath.Length - 1);
swXcopy.WriteLine(string.Format(@"
@echo off
xcopy /y/s/e/v " + strOriginalPath + " " + Directory.GetCurrentDirectory() +"", AppDomain.CurrentDomain.FriendlyName));
}
string filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "killmyself.bat");
using (StreamWriter bat = File.CreateText(filename))
{
// 自刪除,自啟動
bat.WriteLine(string.Format(@"
@echo off
:selfkill
attrib -a -r -s -h ""{0}""
del ""{0}""
if exist ""{0}"" goto selfkill
call XCopyFiles.bat
del XCopyFiles.bat
del /f/q " + tempUpdatePath+Environment.NewLine + " rd " + tempUpdatePath +Environment.NewLine + " start " + mainAppExe +Environment.NewLine + " del %0 ", AppDomain.CurrentDomain.FriendlyName));
}

// 啟動自刪除批處理文件
ProcessStartInfo info = new ProcessStartInfo(filename);
info.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(info);

// 強制關閉當前進程
Environment.Exit(0);
}

 

第三步調用時,原程序本身就有一個Try的做法,就在Catch裡面判斷一下,如果出現IOException,就調用這個方法。

 

點擊完成復制更新文件到應用程序目錄
private void btnFinish_Click(object sender, System.EventArgs e)
{
this.Dispose();
//KillSelfThenRun();
try
{
CopyFile(tempUpdatePath, Directory.GetCurrentDirectory());
System.IO.Directory.Delete(tempUpdatePath, true);
}
catch (Exception ex)
{
if (ex.GetType() == typeof(IOException))
{
KillSelfThenRun();
}
else
{
MessageBox.Show(ex.Message.ToString());
}
}
if (true == this.isRun) Process.Start(mainAppExe);
}

 經過分析後還是覺得第一種方法來得快些,簡單易用:

先看使用方法:

在主程序界面裡面增加一個定時器,然後用來延時來判斷服務器上的程序是否有更新,如果在程序一開始就判斷,程序會加載很慢,從而給用戶體驗不好.

             m_localPath = thisexename = Application.ExecutablePath.Replace(m_localPath, =  isupdate == MessageBox.Show(, ,  (dlg ==

然後程序就會顯示更新進度條:

程序更新後將自己命令為*.old,然後使用MOVE命令將新的更新為自己.

服務器上的返回XML文件列表方式:

<?xml version= encoding= ?>  
<AutoUpdater> 
 
  <UpdateInfo id=>  
    <Version value = />  
  </UpdateInfo>  
  <!--升級文件列表-->  
  <UpdateFileList>  
    <UpdateFile>software\H31Thunder.exe</UpdateFile>
   <!--可以復制多行,更新自己目錄下面的程序--> 
  <UpdateFile>software\H31Thunder.exe</UpdateFile>  
</UpdateFileList> </AutoUpdater>

 

程序自動更新類代碼

 如果大家有什麼更好的方法,請指教.謝謝.

下載程序:H31Thunder.rar

 http://h31bt.com網址是不是自己服務器上的... 

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved