智能升级也简单(用Web Services制作升级程序)

  • Post author:
  • Post category:其他




升级程序的制作有多种方法,下面介绍一种用



Web Services



制作的升级程序。通过



Web Services



升级程序就象读写本机文件一样简单。所以我就直接给出代码。










Web Services





部分代码:





using


System;


using


System.Web;


using


System.Web.Services;


using


System.Web.Services.Protocols;


using


System.IO;



[

WebService

(Namespace =

“http://tempuri.org/”

)]


[

WebServiceBinding

(ConformsTo =

WsiProfiles

.BasicProfile1_1)]


public



class


Service

: System.Web.Services.

WebService


{





public

Service()




{





//如果使用设计的组件,请取消注释以下行





//InitializeComponent();




}







///




<summary>





///


需要升级文件的服务器路径





///




</summary>





private


const


string

UpdateServerPath =

“d://Debug”

;




[

WebMethod

(Description =

“返回服务器上程序的版本号”

)]





public


string

ServerVer()




{





return


“4.0”

;




}




[

WebMethod

(Description =

“返回需更新的文件”

)]





public


string

[] NewFiles()




{





DirectoryInfo

di =

new


DirectoryInfo

(UpdateServerPath);





FileInfo

[] fi = di.GetFiles();





int

intFiles= fi.Length;





string

[] myNewFiles =

new


string

[intFiles];





int

i = 0;







foreach

(

FileInfo

fiTemp

in

fi)




{




myNewFiles[i] = fiTemp.Name;




System.Diagnostics.

Debug

.WriteLine(fiTemp.Name);




i++;




}






return

myNewFiles;




}




[

WebMethod

(Description =

“返回需更新的文件的大小”

)]







public


int

AllFileSize()




{





int

filesize = 0;





string

[] files =

Directory

.GetFiles(UpdateServerPath);





foreach

(

string

file

in

files)




{





FileInfo

myInfo =

new


FileInfo

(file);




filesize += (

int

)myInfo.Length / 1024;




}





return

filesize;




}





[

WebMethod

(Description =

“返回给定文件的字节数组”

)]





public


byte

[] GetNewFile(

string

requestFileName)




{





///


得到服务器端的一个文件





if

(requestFileName !=

null

|| requestFileName !=

“”

)





return

getBinaryFile(UpdateServerPath +

“//”

+requestFileName);





else







return


null

;




}






///




<summary>





///


返回所给文件路径的字节数组。





///




</summary>





///




<param name=”filename”></param>





///




<returns></returns>





private


byte

[] getBinaryFile(

string

filename)




{





if

(

File

.Exists(filename))




{







try




{





//打开现有文件以进行读取。





FileStream

s =

File

.OpenRead(filename);





return

ConvertStreamToByteBuffer(s);




}





catch




{





return


new


byte

[0];






}




}





else




{





return


new


byte

[0];




}




}





///




<summary>





///


把给定的文件流转换为二进制字节数组。





///




</summary>





///




<param name=”theStream”></param>





///




<returns></returns>





private


byte

[] ConvertStreamToByteBuffer(System.IO.

Stream

theStream)




{





int

b1;




System.IO.

MemoryStream

tempStream =

new

System.IO.

MemoryStream

();





while

((b1 = theStream.ReadByte()) != -1)




{




tempStream.WriteByte(((

byte

)b1));




}







return

tempStream.ToArray();




}



}





升级程序代码:





using


System;


using


System.Collections.Generic;


using


System.ComponentModel;


using


System.Data;


using


System.Drawing;


using


System.Text;


using


System.Windows.Forms;


using


System.Threading;


using


System.Xml;


using


System.IO;


using


System.Diagnostics;



namespace


AutoUpdate


{





public


partial


class


frmAutoUpdate

:

Form




{





public

frmAutoUpdate()




{




InitializeComponent();




}





///




<summary>





///


当前版本





///




</summary>





private


string

m_strLocalVer;





///




<summary>





///


服务器版本





///




</summary>





private


string

m_strServerVer;





///




<summary>





///


需要更新的文件总数





///




</summary>





private


int

m_intFilesCount = 0;





///




<summary>





///


需要更新的文件大小





///




</summary>





private


int

m_AllFileSize;





///




<summary>





///


正在下载的文件大小





///




</summary>





private


int

m_downingFileSize;





///




<summary>





///


已经下载的文件大小





///




</summary>





private


int

m_downedFileSize;





///




<summary>





///


数组,需要更新的文件





///




</summary>





private


string

[] m_Files =

null

;





///




<summary>





///


定义文件对象





///




</summary>




WebReference.

Service

ws;





///




<summary>





///


连接WebServeces并下载文件线程





///




</summary>





private


Thread

DownThread;





private


void

frmAutoUpdata_Load(

object

sender,

EventArgs

e)




{




DownThread =

new


Thread

(

new


ThreadStart

(StartUpdate));




DownThread.Start();




}





///




<summary>





///


连接服务器,开始升级





///




</summary>





private


void

StartUpdate()




{




ws =

new

WebReference.

Service

();




m_AllFileSize = ws.AllFileSize();





try




{






m_strLocalVer =

Config

.Ver;

//从配置文件中读取当前版本号




m_strServerVer = ws.ServerVer();

//保存服务器版本号





BeginInvoke(

new

System.

EventHandler

(UpdateUI), lblLink);






//当前版本低于服务器版本,开始更新…





if

(

double

.Parse(m_strLocalVer) <

double

.Parse(m_strServerVer))




{




BeginInvoke(

new

System.

EventHandler

(UpdateUI), lblDownLoad);





m_Files = ws.NewFiles();

//需要更新的文件





if

(m_Files !=

null

)






{




m_intFilesCount = m_Files.Length;





for

(

int

i = 0; i <= m_intFilesCount – 1; i++)




{




DownFile(m_Files[i]);





Debug

.WriteLine(m_Files[i]);




}





// Config.VER = strServerVer;//将版本号记录到配置文件中




}




}





else




{




BeginInvoke(

new


EventHandler

(OnShowMessage),





“你计算机上安装的已经是最新版本了,不需要升级.”

);





return

;




}






}





catch

(

Exception

ex)




{




BeginInvoke(

new


EventHandler

(OnShowMessage), ex.Message);





return

;




}





//UI线程设置label属性




BeginInvoke(

new

System.

EventHandler

(UpdateUI), lblStartExe);





//安装文件





MethodInvoker

miSetup =

new


MethodInvoker

(

this

.StartSetup);





this

.BeginInvoke(miSetup);




}





///




<summary>





///


下载文件





///




</summary>





///




<param name=”fileName”>


文件名


</param>





private


void

DownFile(

string

fileName)




{





//得到二进制文件字节数组;





byte

[] bt = ws.GetNewFile(fileName);




m_downingFileSize = bt.Length / 1024;





string

strPath =

Application

.StartupPath +

“//Update//”

+ fileName;





if

(

File

.Exists(strPath))




{





File

.Delete(strPath);




}





FileStream

fs =

new


FileStream

(strPath,

FileMode

.CreateNew);




fs.Write(bt, 0, bt.Length);




fs.Close();




}





///




<summary>





///


开始安装下载的文件





///




</summary>





private


void

StartSetup()




{





// 结束当前运行的主程序





Process

[] pros =

Process

.GetProcesses();





for

(

int

i = 0; i < pros.Length; i++)




{





if

(pros[i].ProcessName ==

“教师考勤系统”

)




{




pros[i].Kill();




}




}





// 开始复制文件





for

(

int

i = 0; i <= m_intFilesCount – 1; i++)




{





string

sourceFileName =

Application

.StartupPath +

“//Update//”

+ m_Files[i];





string

destFileName =

Application

.StartupPath +

“//”

+ m_Files[i];





if

(

File

.Exists(destFileName))




{





File

.Delete(destFileName);




}







File

.Copy(sourceFileName, destFileName,

false

);




}





// 升级完成,启动主程序





string

StrExe =

Application

.StartupPath +

“//教师考勤系统.exe”

;






if

(

File

.Exists(StrExe))




{




System.Diagnostics.

Process

.Start(StrExe);




}






//关闭升级程序





Application

.Exit();




}





#region


辅助方法,确保线程安全






///




<summary>





///


Label上显示信息





///




</summary>





private


void

UpdateUI(

object

sender,

EventArgs

e)




{





Label

lbl = (

Label

)sender;




lbl.ForeColor =

SystemColors

.Desktop;




lblLocalVer.Text = m_strLocalVer;




lblServerVer.Text = m_strServerVer;




}






///




<summary>





///


显示对话框





///




</summary>





private


void

OnShowMessage(

object

sender,

EventArgs

e)




{







MessageBox

.Show(

this

, sender.ToString(),

this

.Text,





MessageBoxButtons

.OK,

MessageBoxIcon

.Information);





Thread

.Sleep(100);





this

.Close();




}





///




<summary>





///


显示进度条





///




</summary>





private


void

InvokePrgBar()




{





if

(prgBar.Value < 100)




{




prgBar.Value = 100 * (

int

)m_downedFileSize / m_AllFileSize;




prgBar.Update();




System.Diagnostics.

Debug

.WriteLine(

“prgBar.Value:{0}”

+ prgBar.Value);




}




}





///




<summary>





///


计算文件已下载的百分比





///




</summary>





private


void

subPrgBar()




{




m_downedFileSize += m_downingFileSize;




System.Diagnostics.

Debug

.WriteLine(

“AllFileSize




+ m_AllFileSize);




System.Diagnostics.

Debug

.WriteLine(

“downingFileSize




+ m_downingFileSize);





do




{





Thread

.Sleep(100);





MethodInvoker

mi =

new


MethodInvoker

(

this

.InvokePrgBar);





this

.BeginInvoke(mi);




}

while

(m_AllFileSize <= m_downedFileSize);




}




#endregion






///




<summary>





///


关闭窗体时关闭线程





///




</summary>





///




<param name=”sender”></param>





///




<param name=”e”></param>





private


void

frmAutoUpdate_FormClosing(

object

sender,

FormClosingEventArgs

e)




{





try




{




DownThread.Abort();




}





catch




{




;




}




}




}


}



效果图:





如有问题,请留言告之。谢谢

~



版权声明:本文为chendazhi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。