微剋多資訊

 找回密碼
 註冊

Login

Login

搜索
回覆 5則 瀏覽 2326篇

[碼源] AutoIt 撰寫的自動更新程序,各軟體皆適用

該用戶從未簽到

發表於 2013-2-15 00:17 | 顯示全部樓層 |閱讀模式
本帖最後由 rictirse 於 2014-5-27 10:40 編輯



可自動偵測本機內的檔案大小,是否與伺服器端的檔案相同
如不相同會自動啟動更新作業,可適用各種軟體更新作業
  1. #include <GUIConstants.au3>
  2. #include <Misc.au3>
  3. Opt ("GUIOnEventMode", 1)

  4. Dim $Title = "AutoUpdata"
  5. Dim $FilePath_Server = "http://xxxxxxxxxxx";;伺服器新檔案
  6. Dim $FilePath_Local = "R:\run.exe" ;;需要更新程式的路徑

  7. _Singleton ($Title);;僅允許程式單獨執行

  8. ;~ _Check();;前置檢查作業

  9. GUICreate ( $Title, 280, 80)

  10. GUICtrlCreateLabel ("更新進度", 10, 20)

  11. $Progres = GUICtrlCreateProgress ( 70, 15, 200, 20)
  12. GUICtrlCreateButton ("開始更新", 70, 50, 60, 20)
  13.   GUICtrlSetOnEvent ( -1, "_Start")
  14. GUICtrlCreateButton ( "離開", 150, 50, 60, 20)
  15.   GUICtrlSetOnEvent ( -1, "_Exit")

  16. GUISetState ()

  17. While True
  18.   Sleep (50)
  19. WEnd

  20. Func _Exit()
  21.   Exit
  22. EndFunc

  23. Func _Start()
  24.   $TotalSize = InetGetSize ($FilePath_Server) ;; 取得總容量
  25.   $hDownload = InetGet ($FilePath_Server, $FilePath_Local, 1, 1) ;;開始下載

  26.   Do
  27.     Sleep (50)
  28.     $NowDownload = InetGetInfo($hDownload, 0)

  29.     $per = Int ($NowDownload/$TotalSize*100) ;;計算百分比
  30.     $res = Int (StringLeft ( $per, 3)) ;;百分值
  31.     GUICtrlSetData ($progres , $res) ;;下載進度

  32.     TrayTip ( "正在下載更新中", "已下載 " & ($NowDownload/1024)&" kB", 1) ;;監視已下載大小

  33.   Until InetGetInfo ( $hDownload, 2)

  34.   GuiCtrlSetData ( $progres , 0)

  35.   If $TotalSize = FileGetSize ($FilePath_Local) Then
  36.     MsgBox ( 0, "更新完成", "檔案大小:" &Int ($TotalSize/1024)&" kB"&@CRLF&"已下載大小:" & Int ($NowDownload/1024)&" kB")
  37.     Run($FilePath_Local) ;;執行程序
  38.     Exit
  39.   Else
  40.     MsgBox ( 16, "錯誤", "更新失敗。")
  41.   EndIf

  42. EndFunc

  43. Func _Check()
  44.   $Ping = Ping ( "8.8.8.8", 500) ;;;檢查網路是否通暢

  45.   If $Ping Then
  46.     TrayTip ( "自動更新程序", "正在檢查檔案...", 2)
  47.   Else
  48.     MsgBox ( 16, "警告", "網路連結失敗,請稍後再嘗試。")
  49.     Exit
  50.   EndIf

  51.   $FileSize_Server = InetGetSize ($FilePath_Server);;取得伺服器新檔案的大小
  52.   If @error Then
  53.     MsgBox ( 36, "警告", "無法取得伺服器訊息,")
  54.     Exit
  55.   EndIf

  56.   $FileSize_Local = FileGetSize ("run.exe");;取得本機檔案大小
  57.   If @error Then
  58.     If MsgBox ( 36, "警告", "無法取得檔案資訊,是否繼續下載。") = 7 Then Exit
  59.   EndIf

  60.   If $FileSize_Server = $FileSize_Local Then
  61.       MsgBox( 0, "提示", "檔案檢查完成"&@CRLF&"目前已為最新版。")
  62.       Exit
  63.   EndIf
  64. EndFunc
複製代碼

本帖子中包含更多資源

您需要 登入 才可以下載或查看,沒有帳號?註冊

x

點評

如果加上CRC和MD5做簡單的校對會更棒 !  發表於 2013-2-15 00:44
  • 精闢分析,獨特觀點

    gary8349 貢獻度 +20

  • 很實用!

    xx910203 貢獻度 +20

簽到天數: 4

該用戶今日未簽到

發表於 2013-2-15 00:38 | 顯示全部樓層
噹噹,
你利用檔案大小來判斷很不錯!
我都是寫一個ini到檔案裡面,
之後匯入到使用者電腦中,
開啟程式後
,
它會自動跟server端的版本做比對..

回覆

使用道具 舉報

該用戶從未簽到

 樓主| 發表於 2013-2-15 02:18 | 顯示全部樓層
本帖最後由 rictirse 於 2014-5-27 10:40 編輯
bunnie 發表於 2013-2-15 00:38
噹噹,
你利用檔案大小來判斷很不錯!
我都是寫一個ini到檔案裡面,

其實用MD5去判斷會更準確
只是我不太確定Server上面的是不是可以產生MD5
不然就是要先手動產生放在XML上
然後用 _MD5(@ScriptFullPath) 產生MD5 去跟 網路上的MD5做比對
這是比較複雜的方法

附上MD5 UDF
  1. $sFile = @WindowsDir & "\Explorer.exe"
  2. MsgBox (0,"", _MD5($sFile))

  3. Func _MD5($sFile)
  4.   Local Const $CALG_MD2 = 0x8001
  5.   Local Const $CALG_MD4 = 0x8002
  6.   Local Const $CALG_MD5 = 0x8003
  7.   Local Const $CALG_SHA1 = 0x8004

  8.   $hFile = FileOpen ($sFile, 16)
  9.   $bData = FileRead ($hFile)
  10.   $iLength = BinaryLen ($bData)
  11.   FileClose($hFile)

  12.   $tBuffer = DllStructCreate("byte[" & $iLength & "]")
  13.   $pBuffer = DllStructGetPtr($tBuffer)
  14.   DllStructSetData($tBuffer, 1, $bData)

  15.   $iResult = DllCall ("Crypt32.dll", "int", "CryptHashCertificate", "hWnd", 0, "dword", $CALG_MD5, "dword", 0, "ptr", $pBuffer, "dword", $iLength, "ptr", 0, "dword*", 0)
  16.   $tResult = DllStructCreate ("byte[" & $iResult[7] & "]")
  17.   $pResult = DllStructGetPtr ($tResult)
  18.   $iResult = DllCall ("Crypt32.dll", "int", "CryptHashCertificate", "hWnd", 0, "dword", $CALG_MD5, "dword", 0, "ptr", $pBuffer, "dword", $iLength, "ptr", $pResult, "dword*", $iResult[7])
  19.   If $iResult[0] <> 0 Then Return StringTrimLeft (DllStructGetData ($tResult, 1), 2)

  20.   $tBuffer = 0
  21.   $tResult = 0
  22. EndFunc
複製代碼
回覆 1 0

使用道具 舉報

簽到天數: 1

該用戶今日未簽到

發表於 2013-2-15 02:45 | 顯示全部樓層
rictirse 發表於 2013-2-15 02:18
其實用MD5去判斷會更準確
只是我不太確定Server上面的是不是可以產生MD5
不然就是要先手動產生放在XML上

應該是先在伺服器端就有一份md5.crc.sha的資料這樣會比較簡單,不管是手動還是自動

因為檔案沒事應該不會放著自己壞掉...



不過如果沒特殊需求的話我覺得最快的做法是直接比對版本號!

雜湊值用在下載更新回來的時候確認檔案沒有掉包
回覆

使用道具 舉報

該用戶從未簽到

發表於 2013-5-28 15:58 | 顯示全部樓層
bunnie 發表於 2013-2-15 00:38
噹噹,
你利用檔案大小來判斷很不錯!
我都是寫一個ini到檔案裡面,

很不錯的思路!之前都沒想到
回覆

使用道具 舉報

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

小黑屋|Archiver|微剋多資訊(MicroDuo)

GMT+8, 2016-12-11 14:01

Discuz! X

© 2009-2016 Microduo

快速回覆 返回頂部 返回列表