日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

客户端程序自动更新(升级)的方式

發(fā)布時(shí)間:2023/12/20 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客户端程序自动更新(升级)的方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

from:https://blog.csdn.net/woaitingting1985/article/details/72954652

一、C/S自動(dòng)更新原理

?C/S程序自動(dòng)升級(jí)是一個(gè)很重要的功能,原理其實(shí)很簡(jiǎn)單,一般包含兩個(gè)程序一個(gè)是主程序,也就是除了升級(jí)功能以外的程序,另一個(gè)就是升級(jí)程序,常見的360,金山安全衛(wèi)士都是這樣。

?主要包括以下幾點(diǎn):?? 1 比較版本? 2下載文件? 3更新文件 4啟動(dòng)主程序。但其中的需要注意的細(xì)節(jié)很多。?

  ? 一般服務(wù)端會(huì)有一個(gè)配置文件包含最新更新的文件信息的配置文件,當(dāng)然這些更新信息也可以存到數(shù)據(jù)庫,或者其他地方。客戶端(也就是需要更新的那部分程序)也有一個(gè)配置文件包含客戶端版本信息,這些信息可以存到專門的一個(gè)配置文件中,或者是config文件中,沒有一定的規(guī)定,可以根據(jù)實(shí)際設(shè)計(jì)。

?? 在客戶端程序啟動(dòng)時(shí),先啟動(dòng)更新程序通過比較本地版本和服務(wù)端最新的版本信息判斷是否有新版本,如果有可以直接下載,下載完成替換成功后并更新客戶端版本信息,啟動(dòng)主程序。

? ? ?? ? ?? 缺點(diǎn):如果更新速度由于更新的文件很大或者網(wǎng)速很慢,用戶不得不等待很長(zhǎng)時(shí)間,直到下載完成或者下載失敗。

? ? ? ? ? ? 優(yōu)點(diǎn):處理完成后,啟動(dòng)的直接就是更新后的程序。不會(huì)出現(xiàn)由于主程序在運(yùn)行導(dǎo)致替換文件時(shí)提示文件在使用,不能替換之類的錯(cuò)誤。

?? 另一種方法是, 在客戶端段程序啟動(dòng)時(shí),啟動(dòng)更新程序,但更新程序不做版本判斷,到客戶端更新目錄下檢查有沒有下載的新版本,如果有就更新主程序并更新客戶端版本信息,然后啟動(dòng)主程序,如果沒有就直接啟動(dòng)主程序。由主程序判斷是否有新版本,并在后臺(tái)下載把文件放到客戶端更新目錄中,下載完成后,提示用戶退出主程序,重新啟動(dòng),在啟動(dòng)時(shí)由更新程序并更新客戶端和客戶端版本信息。????

? ? ?? ? ?? 缺點(diǎn):由于下載是在主程序的后臺(tái)運(yùn)行,可能會(huì)影響主程序的處理速度。

? ? ? ? ? ? 優(yōu)點(diǎn):避免了由于下載導(dǎo)致用戶長(zhǎng)時(shí)間的等待。

1 比較版本

? ??比較依據(jù):

??? 可以通過文件的最后修改時(shí)間,或者使用文件版本作為比較依據(jù),使用文件最后修改時(shí)間顯然不是標(biāo)準(zhǔn)的做法,但也沒有錯(cuò)誤,但需要注意日期的格式一定要統(tǒng)一,避免日? 期格式不一致導(dǎo)致錯(cuò)誤。可以使用Fileinfo類獲取最后修改時(shí)間,注意時(shí)間應(yīng)該取服務(wù)器時(shí)間,編譯程序集的機(jī)器時(shí)間應(yīng)該相同,否則可能導(dǎo)致混亂。

FIleInfo類官網(wǎng)參考

?? 使用文件版本作為標(biāo)準(zhǔn),則每次修改時(shí)必須修改版本號(hào),C#程序就是要修AssemblyInfo.cs文件中的內(nèi)容了,多了一步,規(guī)范多了。Version類處理版本信息并比較。?

  • Assembly?thisAssem?=?Assembly.GetExecutingAssembly();??
  • ?????AssemblyName?thisAssemName?=?thisAssem.GetName();??
  • ?????Version?ver?=?thisAssemName.Version;??
  • Version類官網(wǎng)參考

    ? 當(dāng)然也有其他的方式,例如MD5校驗(yàn)值比較,文件大小比較,之類的方法。不過個(gè)人認(rèn)為文件大小缺陷很明顯,新版本文件就一定比舊文件大嗎?不一定吧。重構(gòu)是可能變小的。

    當(dāng)然如果考慮客戶端有不同的版本,都需要升級(jí)到最新的版本,顯然不同的版本對(duì)應(yīng)的升級(jí)文件不同,會(huì)更復(fù)雜,比較的信息也更多。

    ???獲取服務(wù)端版本信息:

    ??? 如果服務(wù)端的版本信息存在數(shù)據(jù)庫,直接讀取數(shù)據(jù)庫,就可以獲取。如果存在配置文件,則可以通過webservice方法獲取,或者請(qǐng)求一個(gè)網(wǎng)頁 通過Response.Write();的方式獲取信息,當(dāng)然這兩種方式都要建立虛擬目錄或者網(wǎng)站。

    2下載文件

    ??存儲(chǔ)位置:

    ???? 如果新版本的文件存在數(shù)據(jù)庫,就直接讀取數(shù)據(jù)庫,不過這種方式個(gè)人不建議使用,例如更新文件很大時(shí)性能不是很好。

    ??? 存在固定虛擬目錄的指定路徑下,不失為一種好的方式,但客戶端要下載,所以要注意一定要分配下載權(quán)限。

    下載方式:

    ?? 直接向通過虛擬路徑發(fā)出請(qǐng)求,下載文件,由于虛擬路徑有下載權(quán)限,如果更新需要判斷是否有權(quán)限,例如要交費(fèi)后才能下載則不好處理。

    ? 另一種方式是向一個(gè)網(wǎng)頁發(fā)送請(qǐng)求,傳遞不同的查詢字符串,網(wǎng)頁 通過Response.BinaryWrite();的方式下載文件,則可以判斷權(quán)限,當(dāng)然麻煩一些是避免不了的。

    下載文件代碼

  • Uri?uri?=?new?Uri(downFileUrl?+?localFileName);??
  • ??????????????HttpWebRequest?request?=?(HttpWebRequest)WebRequest.Create(uri);??
  • ??????????????request.Credentials?=?CredentialCache.DefaultCredentials;??
  • ??????????????request.MaximumAutomaticRedirections?=?4;??
  • ??????????????localFileName?=?Path.GetFileName(localFileName);??
  • ??????????????using?(HttpWebResponse?response?=?(HttpWebResponse)request.GetResponse())??
  • ??????????????{??
  • ??????????????????Stream?receiveStream?=?response.GetResponseStream();??
  • ??????????????????string?newPath?=?Path.Combine(tempFold,?localFileName);??
  • ??????????????????using?(FileStream?fs?=?new?FileStream(newPath,?FileMode.Create))??
  • ??????????????????{??
  • ??????????????????????Byte[]?buffer?=?new?Byte[4096];??
  • ??????????????????????int?bytesRead?=?receiveStream.Read(buffer,?0,?buffer.Length);??
  • ??????????????????????while?(bytesRead?>?0){??
  • ??????????????????????????fs.Write(buffer,?0,?bytesRead);??
  • ??????????????????????????bytesRead?=?receiveStream.Read(buffer,?0,?buffer.Length);??
  • ??????????????????????}??
  • ??????????????????}??
  • ??????????????????receiveStream.Close();??
  • ??????????????}??
  • 3更新文件

    ??????更新類型:

    ?? ? 直接替換的,例如修改了bug,直接替換的。

    ?? ? 新增加的,例如新增加的功能做成了新的類庫。

    ??? 需要?jiǎng)h除的,例如有些功能由于重構(gòu)或者使用了了新方法不需要的。

    ? ?? 需要執(zhí)行的,例如寫注冊(cè)表,注冊(cè)COM組件的。

    ???? 每一種處理方式都不一樣,需要根據(jù)類型分開處理

    ? ?? 缺點(diǎn):升級(jí)后,沒辦法取消升級(jí),像windows的補(bǔ)丁程序可以安裝,可以卸載的原理,目前還沒有研究明白,希望知道的牛人指導(dǎo)。

    ??? 當(dāng)然也可以簡(jiǎn)單的先卸載,再安裝,對(duì)于配置文件之類的信息特殊處理一下也可以。

    ?? 當(dāng)然如果考慮客戶端有不同的版本,都需要升級(jí)到最新的版本,顯然不同的版本對(duì)應(yīng)的升級(jí)文件不同,會(huì)更復(fù)雜,但基本原理卻不變。

    4啟動(dòng)主程序

    ??主程序路徑的獲取:

    ?? 相對(duì)路徑?? 主程序,更新程序,都使用相對(duì)路徑,缺點(diǎn)是一旦相對(duì)路徑確定后,后續(xù)的更新就不能更改這種目錄關(guān)系。

    ? 注冊(cè)表? 路徑都存入注冊(cè)表,需要時(shí)通過注冊(cè)表交互,主程序?qū)懽?cè)表,更新程序讀取注冊(cè)表,缺點(diǎn)是讀寫注冊(cè)表需要權(quán)限,寫的路徑也要固定,后續(xù)的更新不能改變寫在注冊(cè)表中的位置,也就是注冊(cè)表路徑。

    運(yùn)行程序代碼

    ?

  • private?static?void?RunFile(string?dir,?string?localFileName){??
  • ??????????string?info?=?"運(yùn)行程序"?+?localFileName;??
  • ??????????try{??
  • ??????????????if?(File.Exists(Path.Combine(dir,?localFileName))){??
  • ??????????????????Process?myProcess?=?new?Process();??
  • ??????????????????ProcessStartInfo?psi?=?new?ProcessStartInfo();??
  • ??????????????????psi.FileName?=?localFileName;??
  • ??????????????????psi.WorkingDirectory?=?dir;??
  • ??????????????????psi.UseShellExecute?=?false;??
  • ??????????????????psi.RedirectStandardError?=?true;??
  • ??????????????????psi.CreateNoWindow?=?true;??
  • ??????????????????psi.RedirectStandardOutput?=?true;??
  • ??????????????????psi.WindowStyle?=?ProcessWindowStyle.Hidden;??
  • ??????????????????myProcess.StartInfo?=?psi;??
  • ??????????????????myProcess.Start();??
  • ??
  • ??????????????????string?error?=?myProcess.StandardError.ReadToEnd();??
  • ??????????????????string?output?=?myProcess.StandardOutput.ReadToEnd();??
  • ??????????????????myProcess.WaitForExit();??
  • ??????????????????myProcess.Close();??
  • ??????????????????if?(error?!=?string.Empty){??
  • ???????????????????Log.Write("StandardError:"?+?error);??
  • ??????????????????}??
  • ??????????????????if?(output?!=?string.Empty){??
  • ??????????????????????Log.Write("StandardOutput:"?+?output);??
  • ??????????????????}??
  • ??????????????????Log.LogProcessEnd(info);??
  • ??????????????}??
  • ??????????}??
  • ??????????catch?(Exception?ex){??
  • ?????????????Log.Write(info?+?"出錯(cuò)");??
  • ?????????????Log.LogException(ex);??
  • ??????????????throw?ex;??
  • ??????????}??
  • ??????}??
  • ??} ?

  • 二、使用HttpWebRequest自動(dòng)更新客戶端更新客戶端應(yīng)用程序,對(duì)于采用Socket實(shí)現(xiàn)的,可以采用Socket從服務(wù)器端下載;對(duì)于其它方式, 一般可以采用以HttpWebRequest/WebClient的方式予以下載,但WebClient在下載的時(shí)候無法看到下載進(jìn)度,因此,使用HttpWebRequest?下載文件,根據(jù)讀取到的流長(zhǎng)度,確定當(dāng)前下載的數(shù)據(jù)量,以反應(yīng)當(dāng)前下載的進(jìn)度。

    ??? 找了半天也沒有找到在那兒可以上傳文件,所以只好將文件上傳到博客園。

    下載地址:http://www.cnblogs.com/Files/bluedream/Update.rar

    說明:

    在客戶端,用戶實(shí)際運(yùn)行的是更新程序,在更新程序檢查完成后,再運(yùn)行實(shí)際的客戶端。當(dāng)然,這個(gè)對(duì)用戶是隱藏的。

    1、DownloadFile.cs: 使用HttpWebRequest下載指定URL的文件

    2、EventArgs.cs:委托及事件

    3、FormUpdate.cs:下載時(shí)的UI處理

    4、Global.cs和UpdateUtility.cs通用處理函數(shù)庫

    5、Client.cs:更新客戶端的應(yīng)用程序

    6、Update文件:客戶端更新配置文件,在更新時(shí),應(yīng)用程序先讀取Update文件,然后根據(jù)Update文件中存儲(chǔ)的遠(yuǎn)程服務(wù)器URL地址,讀取遠(yuǎn)程更新文件,接著比較遠(yuǎn)程服務(wù)器配置文件與本地配置文件及本地文件相比較,確定更新列表,然后下載文件;下載完成后,覆蓋本地文件;再刪除臨時(shí)文件;最后調(diào)用本地配置文件指定的更新完成后應(yīng)運(yùn)行的應(yīng)用程序。


    三、JAVA自動(dòng)更新客戶端

    最近由于一個(gè)工程需要做應(yīng)用程序啟動(dòng)時(shí),自動(dòng)更新的項(xiàng)目
    在GOOGLE上找了半天也沒見到什么比較好的辦法
    自己動(dòng)手寫了一個(gè)通過版本號(hào)檢查網(wǎng)絡(luò)上是不是存在新的更新文件,并自動(dòng)通過HTTP下載文件的程序
    希望對(duì)正在找此類程序的朋友有幫助

    本地文件需要一個(gè)ver.txt? 此文件內(nèi)容為本地軟件版本號(hào)
    網(wǎng)絡(luò)上我直接在一個(gè)頁面上打印出網(wǎng)絡(luò)存在的版本號(hào)
    例如,這個(gè)例子里,我在?http://XXX.XXX.XXX/AutoUpdate/ver? 這里直接打印出版本號(hào)

    源文件:http://211.136.109.100/beiouwolf/AutoUpdate.rar

    ?

    [java]?view plaincopy?
  • import?javax.swing.*;??
  • import?java.awt.*;??
  • import?java.net.*;??
  • import?java.io.*;??
  • ??
  • public?class?CheckUpdate?extends?JFrame?{??
  • ????JFrame?c?=?this;??
  • ??
  • ????public?CheckUpdate()?{??
  • ????????//設(shè)置窗體屬性??
  • ????????setAttb();??
  • ??
  • ????????JLabel?title?=?new?JLabel("正在檢查網(wǎng)絡(luò)上的更新資源");??
  • ????????this.add(title,?BorderLayout.NORTH);??
  • ????????JTextArea?msg?=?new?JTextArea();??
  • ????????this.add(msg,?BorderLayout.CENTER);??
  • ????????JLabel?process?=?new?JLabel();??
  • ????????this.add(process,?BorderLayout.SOUTH);??
  • ??????????
  • ????????//啟動(dòng)更新線程??
  • ????????new?Check(msg,?process).start();??
  • ????}??
  • ??
  • ????private?class?Check?extends?Thread?{??
  • ????????//標(biāo)識(shí),是否存在新的更新文件??
  • ????????private?boolean?isUpdated?=?false;??
  • ????????//保存最新的版本??
  • ????????String?netVersion;??
  • ????????//本地版本文件名??
  • ????????String?LocalVerFileName?=?"ver.txt";??
  • ??
  • ????????//顯示信息??
  • ????????private?JTextArea?msg;??
  • ????????private?JLabel?process;??
  • ??
  • ????????public?Check(JTextArea?msg,?JLabel?process)?{??
  • ????????????this.msg?=?msg;??
  • ????????????this.process?=?process;??
  • ????????}??
  • ??
  • ????????public?void?run()?{??
  • ????????????//更新文件版本標(biāo)識(shí)URL??
  • ????????????String?versionUrl?=?"http://XXX.XXX.XXX/AutoUpdate/ver";??
  • ??
  • /**//*?
  • 這里是通過HTTP訪問一個(gè)頁面,以取得網(wǎng)絡(luò)上的版本號(hào)?
  • 比如這里就是在這個(gè)頁面直接打印出?6.19.1.1?
  • 然后把這個(gè)版本號(hào)比對(duì)本地的版本號(hào),如果版本號(hào)不同的話,就從網(wǎng)絡(luò)上下載新的程序并覆蓋現(xiàn)有程序?
  • ?
  • */??
  • ??
  • ????????????URL?url?=?null;??
  • ????????????InputStream?is?=?null;??
  • ????????????InputStreamReader?isr?=?null;??
  • ????????????BufferedReader?netVer?=?null;??
  • ??
  • ????????????//讀取網(wǎng)絡(luò)上的版本號(hào)??
  • ????????????try?{??
  • ????????????????url?=?new?URL(versionUrl);??
  • ????????????????is?=?url.openStream();??
  • ????????????????isr?=?new?InputStreamReader(is);??
  • ??
  • ????????????????netVer?=?new?BufferedReader(isr);??
  • ????????????????String?netVerStr?=?netVer.readLine();??
  • ????????????????String?localVerStr?=?getNowVer();??
  • ??
  • ????????????????if?(netVerStr.equals(localVerStr))?{??
  • ????????????????????msg.append("當(dāng)前文件是最新版本\n");??
  • ????????????????????isUpdated?=?false;??
  • ????????????????}?else?{??
  • ????????????????????msg.append("存在更新文件,現(xiàn)在開始更新\n");??
  • ????????????????????isUpdated?=?true;??
  • ????????????????????netVersion?=?netVerStr;??
  • ????????????????}??
  • ??
  • ????????????}?catch?(MalformedURLException?ex)?{??
  • ????????????}?catch?(IOException?ex)?{??
  • ????????????}?finally?{??
  • ????????????????//釋放資源??
  • ????????????????try?{??
  • ????????????????????netVer.close();??
  • ????????????????????isr.close();??
  • ????????????????????is.close();??
  • ????????????????}?catch?(IOException?ex1)?{??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????????//如果版本不同,下載網(wǎng)絡(luò)上的文件,更新本地文件??
  • ????????????if?(isUpdated)?{??
  • ????????????????//本地需要被更新的文件??
  • ????????????????File?oldFile?=?new?File("client.exe");??
  • ????????????????//緩存網(wǎng)絡(luò)上下載的文件??
  • ????????????????File?newFile?=?new?File("temp.exe");??
  • ??????????????????
  • ????????????????//網(wǎng)絡(luò)上的文件位置??
  • ????????????????String?updateUrl?=??
  • ????????????????????????"http://XXX.XXX.XXX/downloads/simpkle.exe";??
  • ??
  • ????????????????HttpURLConnection?httpUrl?=?null;??
  • ????????????????BufferedInputStream?bis?=?null;??
  • ????????????????FileOutputStream?fos?=?null;??
  • ??
  • ????????????????try?{??
  • ????????????????????//打開URL通道??
  • ????????????????????url?=?new?URL(updateUrl);??
  • ????????????????????httpUrl?=?(HttpURLConnection)?url.openConnection();??
  • ??
  • ????????????????????httpUrl.connect();??
  • ??
  • ????????????????????byte[]?buffer?=?new?byte[1024];??
  • ??
  • ????????????????????int?size?=?0;??
  • ??
  • ????????????????????is?=?httpUrl.getInputStream();??
  • ????????????????????bis?=?new?BufferedInputStream(is);??
  • ????????????????????fos?=?new?FileOutputStream(newFile);??
  • ??
  • ????????????????????msg.append("正在從網(wǎng)絡(luò)上下載新的更新文件\n");??
  • ??
  • ????????????????????//保存文件??
  • ????????????????????try?{??
  • ????????????????????????int?flag?=?0;??
  • ????????????????????????int?flag2?=?0;??
  • ????????????????????????while?((size?=?bis.read(buffer))?!=?-1)?{??
  • ????????????????????????????//讀取并刷新臨時(shí)保存文件??
  • ????????????????????????????fos.write(buffer,?0,?size);??
  • ????????????????????????????fos.flush();??
  • ??
  • ????????????????????????????//模擬一個(gè)簡(jiǎn)單的進(jìn)度條??
  • ????????????????????????????if?(flag2?==?99)?{??
  • ????????????????????????????????flag2?=?0;??
  • ????????????????????????????????process.setText(process.getText()?+?".");??
  • ????????????????????????????}??
  • ????????????????????????????flag2++;??
  • ????????????????????????????flag++;??
  • ????????????????????????????if?(flag?>?99?*?50)?{??
  • ????????????????????????????????flag?=?0;??
  • ????????????????????????????????process.setText("");??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}?catch?(Exception?ex4)?{??
  • ????????????????????????System.out.println(ex4.getMessage());??
  • ????????????????????}??
  • ??
  • ????????????????????msg.append("\n文件下載完成\n");??
  • ??
  • ????????????????????//把下載的臨時(shí)文件替換原有文件??
  • ????????????????????CopyFile(oldFile,newFile);??
  • ??????????????????????
  • ????????????????????//把本地版本文件更新為網(wǎng)絡(luò)同步??
  • ????????????????????UpdateLocalVerFile();??
  • ??
  • ????????????????}?catch?(MalformedURLException?ex2)?{??
  • ????????????????}?catch?(IOException?ex)?{??
  • ????????????????????msg.append("文件讀取錯(cuò)誤\n");??
  • ????????????????}?finally?{??
  • ????????????????????try?{??
  • ????????????????????????fos.close();??
  • ????????????????????????bis.close();??
  • ????????????????????????is.close();??
  • ????????????????????????httpUrl.disconnect();??
  • ????????????????????}?catch?(IOException?ex3)?{??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????????//啟動(dòng)應(yīng)用程序??
  • ????????????try?{??
  • ????????????????msg.append("啟動(dòng)應(yīng)用程序");??
  • ????????????????Thread.sleep(500);??
  • ????????????????Process?p?=?Runtime.getRuntime().exec("client.exe");??
  • ????????????}?catch?(IOException?ex5)?{??
  • ????????????}?catch?(InterruptedException?ex)?{??
  • ????????????}??
  • ??????????????
  • ????????????//退出更新程序??
  • ????????????System.exit(0);??
  • ????????}??
  • //復(fù)制文件??
  • ????????private?void?CopyFile(File?oldFile,?File?newFile)?{??
  • ????????????FileInputStream?in?=?null;??
  • ????????????FileOutputStream?out?=?null;??
  • ??????????????
  • ????????????try?{??
  • ????????????????if(oldFile.exists()){??
  • ????????????????????oldFile.delete();??
  • ????????????????}??
  • ????????????????in?=?new?FileInputStream(newFile);??
  • ????????????????out?=?new?FileOutputStream(oldFile);??
  • ??
  • ????????????????byte[]?buffer?=?new?byte[1024?*?5];??
  • ????????????????int?size;??
  • ????????????????while?((size?=?in.read(buffer))?!=?-1)?{??
  • ????????????????????out.write(buffer,?0,?size);??
  • ????????????????????out.flush();??
  • ????????????????}??
  • ????????????}?catch?(FileNotFoundException?ex)?{??
  • ????????????}?catch?(IOException?ex)?{??
  • ????????????}?finally?{??
  • ????????????????try?{??
  • ????????????????????out.close();??
  • ????????????????????in.close();??
  • ????????????????}?catch?(IOException?ex1)?{??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????}??
  • ??
  • ????????private?void?UpdateLocalVerFile()?{??
  • ????????????//把本地版本文件更新為網(wǎng)絡(luò)同步??
  • ????????????FileWriter?verOS?=?null;??
  • ????????????BufferedWriter?bw?=?null;??
  • ????????????try?{??
  • ????????????????verOS?=?new?FileWriter(LocalVerFileName);??
  • ??
  • ????????????????bw?=?new?BufferedWriter(verOS);??
  • ????????????????bw.write(netVersion);??
  • ????????????????bw.flush();??
  • ??
  • ????????????}?catch?(IOException?ex)?{??
  • ????????????}?finally?{??
  • ????????????????try?{??
  • ????????????????????bw.close();??
  • ????????????????????verOS.close();??
  • ????????????????}?catch?(IOException?ex1)?{??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ??
  • ????????private?String?getNowVer()?{??
  • ????????????//本地版本文件??
  • ????????????File?verFile?=?new?File(LocalVerFileName);??
  • ??
  • ????????????FileReader?is?=?null;??
  • ????????????BufferedReader?br?=?null;??
  • ??
  • ????????????//讀取本地版本??
  • ????????????try?{??
  • ????????????????is?=?new?FileReader(verFile);??
  • ??
  • ????????????????br?=?new?BufferedReader(is);??
  • ????????????????String?ver?=?br.readLine();??
  • ??
  • ????????????????return?ver;??
  • ????????????}?catch?(FileNotFoundException?ex)?{??
  • ????????????????msg.append("本地版本文件未找到\n");??
  • ????????????}?catch?(IOException?ex)?{??
  • ????????????????msg.append("本地版本文件讀取錯(cuò)誤\n");??
  • ????????????}?finally?{??
  • ????????????????//釋放資源??
  • ????????????????try?{??
  • ????????????????????br.close();??
  • ????????????????????is.close();??
  • ????????????????}?catch?(IOException?ex1)?{??
  • ????????????????}??
  • ????????????}??
  • ????????????return?"";??
  • ????????}??
  • ????}??
  • ??
  • ??
  • ????private?void?setAttb()?{??
  • ????????//窗體設(shè)置??
  • ????????this.setTitle("Auto?Update");??
  • ????????this.setSize(200,?150);??
  • ????????this.setLayout(new?BorderLayout());??
  • ????????this.setDefaultCloseOperation(EXIT_ON_CLOSE);??
  • ??
  • ????????//?窗體居中??
  • ????????Dimension?screenSize?=?Toolkit.getDefaultToolkit().getScreenSize();??
  • ????????Dimension?frameSize?=?this.getSize();??
  • ????????if?(frameSize.height?>?screenSize.height)?{??
  • ????????????frameSize.height?=?screenSize.height;??
  • ????????}??
  • ????????if?(frameSize.width?>?screenSize.width)?{??
  • ????????????frameSize.width?=?screenSize.width;??
  • ????????}??
  • ????????this.setLocation((screenSize.width?-?frameSize.width)?/?2,??
  • ?????????????????????????(screenSize.height?-?frameSize.height)?/?2);??
  • ????}??
  • ??
  • ????public?static?void?main(String[]?args)?{??
  • ????????CheckUpdate?checkupdate?=?new?CheckUpdate();??
  • ????????checkupdate.setVisible(true);??
  • ????}??
  • } ?


  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 https://blog.csdn.net/woaitingting1985/article/details/72954652

    總結(jié)

    以上是生活随笔為你收集整理的客户端程序自动更新(升级)的方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。