转载 升级程序的制作方法

      收藏  原帖地址 :http://blog.csdn.net/chendazhi/archive/2006/05/09/715542.aspx

升级程序的制作有多种方法,下面介绍一种用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();
        }


        
辅助方法,确保线程安全

        
/// <summary>
        
/// 关闭窗体时关闭线程
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>

        private void frmAutoUpdate_FormClosing(object sender, FormClosingEventArgs e)
        
{
            
try
            
{
                DownThread.Abort();
            }

            
catch
            
{
                ;
            }

        }

    }

}


在创建Web服务时要把位置改为:文件系统(默认为HTTP)
posted @ 2007-07-04 09:31  Boy Xie  阅读(340)  评论(0编辑  收藏  举报