WinForm應用程序中實現自動更新功能


WinForm應用程序中實現自動更新功能

 

編寫人:左丘文

 

2015-4-20

近來在給一客戶實施ECM系統,但他們使用功能並不是我們ECM制造版提供的標准功能,他們要求對系統作一些定制功能,為了避免因程序的bug而帶來頻繁讓用戶更新程序的不良影響,就想給ECM增加一個winform自動更新功能,今天在這里,我想與大家一起分享代碼,在此做個小結,以供參考。有興趣的同學,可以一同探討與學習一下,否則就略過吧。

 

1、 首先我們在這里先分析一下其它程序猿的一些基本情況:

相信有許多程序猿都喜歡用Winform做開發吧?!因為Winform相對Webform而言,優點是,功能更強大,編程更方便.但是它的缺點,就是軟件的安裝及維護是相當麻煩地,要實現軟件更新,需要到客戶端一台一台地升級。

長期以來,廣大程序為到底是使用Client/Server,還是使用Browser/Server結構爭論不休,在這些爭論當中,C/S結構的程序可維護性差,布置困難,升級不方便,維護成本高就是一個相當重要的因素。有很多企業用戶就是因為這個原因而放棄使用C/S。然而當一個應用必須要使用C/S結構才能很好的實現其功能的時候,我們該如何解決客戶端的部署與自動升級問題?部署很簡單,只要點擊安裝程序即可,難的在於每當有新版本發布時,能夠實現自動升級。現在好了,我們的目標很簡單,我們希望開發一個與具體應用無關的能夠復用的自動升級系統。下面我為大家提供了一套可復用的用C#實現在線升級。這里分為本地在線升級,也可以利用webservice 在線通過互聯網與軟件開商的服務器在線升級。

 

2、 實現軟件自動在線升級的原理

1)         寫三個程序,一個是主程序;兩個是升級程序;所有升級任務都由升級程序完成

原本只需要一個升級程序,但在這里,由於我們另外還涉及到了,在線與軟件供應商服務器更新功能,因此我們這里用到了一個主程序兩個升級程序。

2)         很多人實行的原理是將現有版本與最新版本作比較,發現最新的則提示用戶是否升級,當然也有人用其它屬性比較的,例如:文件大小或者更新日期。我們這里主要利用FileUtil的兩個屬性SHA1File與MD5File來判斷,與服務器之間是否存在版本差異,存在就更新。

3)         我們的程序,剛開始初始版本是我一同事利用了三天時間,大致寫了一個框架出來,我是在他的基礎上,對其進行了完善,如增加了對文件流的壓縮與解壓縮功能,方便進行網絡的傳輸,增加了通過webservices的在線更新功能。並將程序做到通用功能,並嵌套到了我們的ECM系統中。

3、 軟件更新操作界面:

1)   啟動我們的主程序ECM

        

2)   系統會從數據庫中檢查是否有新版本,點點【否】會直接進入系統,點【是】系統會進入到更新介面:

先擇需要更新的內容,點擊更新,系統會自動更新相關程序。

      

3)   與軟件供應商服務器在線更新介面:

操作類似於在線本地更新一樣。

 

具體就需要各位好好的自已去調試了。

4、 更新程序的代碼:

1)   我們的更新程序是以文件流的形式存放在數據庫中,因此我們首先需要為系統數據庫增加相關的表,用於存儲更新文件。

--建立相關表

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[SysUpdate](

[ID] [ int] IDENTITY( 1, 1) NOT NULL,

[FileName] [varchar]( 250) NULL,

[FileVersion] [varchar]( 50) NULL,

[FilePath] [varchar]( 250) NULL,

[FileData] [varbinary](max) NULL,

[FileSize] [varchar]( 250) NULL,

[FileDate] [varchar]( 250) NULL,

[FileType] [varchar]( 50) NULL,

[FilesHash] [varchar](max) NULL,

[FilesMD5] [varchar](max) NULL,

[UpdateBit] [bit] NULL,

[RegBit] [bit] NULL

) ON [PRIMARY]

 

GO

SET ANSI_PADDING OFF

--建立插入SP

 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create procedure [dbo].[Insert_UpdateFile] @filename varchar( 250),@fileversion varchar( 50),@filepath varchar( 250),@filesize varchar( 250),@filedate varchar( 250),@filetype varchar( 50),@fileshash varchar( 250),@filesmd5 varchar( 250),@file varbinary(Max)
as
insert into SysUpdate ([FileName],[FileVersion],[FilePath],[FileSize],[FileDate],[FileType],[UpdateBit],[RegBit],[FilesHash],[FilesMD5],[FileData])
select  @filename,@fileversion,@filepath,@filesize,@filedate,@filetype, 1, 0,@fileshash,@filesmd5,@file
View Code

2)   整體程序框架圖如下:

      

3)   上傳功能代碼:

namespace SysUpdate
{
     public  partial  class frmSysUpdateUp : Form
    {
         private  string updateUrl =  string.Empty;
         private  string tempUpdatePath =  string.Empty;
        WinBase.Common W1 =  new WinBase.Common();
      
         public frmSysUpdateUp()
        {
            InitializeComponent();
        }
         private  void frmSysUpdateUp_Load( object sender, EventArgs e)
        {
             // 數據庫SysUpdate表 顯示需要更新內容
            dgvList.ColumnCount =  9;
            dgvList.AutoGenerateColumns =  false;
            DataGridViewCheckBoxColumn newColumn =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 =  new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert( 0, newColumn);
            dgvList.Columns.Insert( 10, newColumn1);
            dgvList.Columns.Insert( 11, newColumn2);
             this.SetdgvListHeadText();
 
             string strSQL41 =  " SELECT * FROM SysUpdate order by ID; ";
            DataSet ds = W1.DS(strSQL41,  " Sys ");
            dgvList.DataSource = ds.Tables[ 0].DefaultView;
             this.DataBinding();
 
            dgvList.Columns[ 0].Frozen =  true;
            dgvList.Columns[ 1].Frozen =  true;
            dgvList.Columns[ 2].Frozen =  true;
            dgvList.Columns[ 3].Frozen =  true;
             //    dgvList.Columns[4].Frozen = true;
        }
 
         private  void SetdgvListHeadText()
        {
            dgvList.Columns[ 0].HeaderText =  " 選擇 ";
            dgvList.Columns[ 0].Width =  50;
            dgvList.Columns[ 1].HeaderText =  " ID ";
            dgvList.Columns[ 1].Width =  20;
            dgvList.Columns[ 1].ReadOnly =  true;
            dgvList.Columns[ 2].HeaderText =  " 組件名 ";
            dgvList.Columns[ 2].Width =  120;
            dgvList.Columns[ 2].ReadOnly =  true;
            dgvList.Columns[ 3].HeaderText =  " 版本號 ";
            dgvList.Columns[ 3].Width =  80;
            dgvList.Columns[ 3].ReadOnly =  true;
 
            dgvList.Columns[ 4].HeaderText =  " 大小 ";
            dgvList.Columns[ 4].Width =  100;
            dgvList.Columns[ 4].ReadOnly =  true;
            dgvList.Columns[ 5].HeaderText =  " 創建日期 ";
            dgvList.Columns[ 5].Width =  150;
            dgvList.Columns[ 5].ReadOnly =  true;
            dgvList.Columns[ 6].HeaderText =  " 哈希值 ";
            dgvList.Columns[ 6].Width =  250;
            dgvList.Columns[ 6].ReadOnly =  true;
            dgvList.Columns[ 7].HeaderText =  " MD5值 ";
            dgvList.Columns[ 7].Width =  250;
            dgvList.Columns[ 7].ReadOnly =  true;
            dgvList.Columns[ 8].HeaderText =  " 目錄 ";
            dgvList.Columns[ 8].Width =  80;
            dgvList.Columns[ 8].ReadOnly =  true;
            dgvList.Columns[ 9].HeaderText =  " 文件類型 ";
            dgvList.Columns[ 9].Width =  80;
            dgvList.Columns[ 9].ReadOnly =  true;
            dgvList.Columns[ 10].HeaderText =  " 是否更新 ";
            dgvList.Columns[ 10].Width =  80;
            //  dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[ 11].HeaderText =  " 是否需要注冊 ";
            dgvList.Columns[ 11].Width =  110;
             // dgvList.Columns[11].ReadOnly = true;
        }
 
         private  string Byte2String( byte[] arrByte)
        {
            StringBuilder sb =  new StringBuilder();
             foreach ( byte b  in arrByte)
            {
                sb.Append(b >  15 ? Convert.ToString(b,  16) :  ' 0 ' + Convert.ToString(b,  16));
            }
             return sb.ToString();
        }
         private  void DataBinding()
        {
 
             //  ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
          
            dgvList.Columns[ 0].DataPropertyName =  " Check1 ";
            dgvList.Columns[ 1].DataPropertyName =  " ID ";
            dgvList.Columns[ 2].DataPropertyName =  " FileName ";
            dgvList.Columns[ 3].DataPropertyName =  " FileVersion ";
          
            dgvList.Columns[ 4].DataPropertyName =  " FileSize ";
            dgvList.Columns[ 5].DataPropertyName =  " FileDate ";
            dgvList.Columns[ 6].DataPropertyName =  " FilesHash ";
            dgvList.Columns[ 7].DataPropertyName =  " FilesMD5 ";
            dgvList.Columns[ 8].DataPropertyName =  " FilePath ";
            dgvList.Columns[ 9].DataPropertyName =  " FileType ";
            dgvList.Columns[ 10].DataPropertyName =  " UpdateBit ";
            dgvList.Columns[ 11].DataPropertyName =  " RegBit ";
        }
 
         private  void ListDate()
        {
             string strSQL41 =  " SELECT * FROM SysUpdate order by ID ; ";
            DataSet ds = W1.DS(strSQL41,  " Sys ");
            dgvList.DataSource = ds.Tables[ 0].DefaultView;
             this.DataBinding();
        }
 
         private  void btnUpload_Click( object sender, EventArgs e)
        {
            txtFileText.Text =  "";
            openFileDialog1.InitialDirectory =  " d:\\ ";
            openFileDialog1.Filter =  " 文件(*.*)|*.* ";
            openFileDialog1.FilterIndex =  1;
            openFileDialog1.RestoreDirectory =  true;
            openFileDialog1.Multiselect =  true;
             if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                txtFileText.Text = openFileDialog1.FileName;
                 // 文件名稱
                String S = System.IO.Path.GetFileName(openFileDialog1.FileName);
 
                 // 文件格式
                
//   String FileType = System.IO.Path.GetExtension(openFileDialog1.FileName);
                 string SHA1 =  "";
                 string md5 =  "";
 
                SHA1 = FileUtil.SHA1File(txtFileText.Text.ToString()); // 這個消息摘要可以用來驗證數據的完整性
                md5 = FileUtil.MD5File(txtFileText.Text.ToString());
 
                 try
                {
                     if (FileUtil.IsInUse(txtFileText.Text.ToString()))
                    {
                        MessageBox.Show( " 文件已經使用中,無法上傳! "" 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
 
                     if (FileUtil.FileIsReadOnly(txtFileText.Text.ToString()))
                    {
                        FileUtil.SetFileReadonly(txtFileText.Text.ToString(),  false);
                    }
                    FileStream fs =  new FileStream(txtFileText.Text.ToString(), FileMode.Open);
                     int streamLength = ( int)fs.Length;       // 獲取文件流的長度。  
                     byte[] image =  new  byte[streamLength];   // 聲明字節數組,用於保存圖片文件  
                    fs.Read(image,  0, streamLength);         // 把圖片文件轉換成為字節數組保存
                    fs.Close();
                     // 文件版本號
                    FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(txtFileText.Text.ToString());
                    FileInfo file =  new FileInfo(txtFileText.Text.ToString());
                   //   byte[] args0 = Common.SharpZip.CompressB(image);
                     byte[] args0 = Common.SharpZip.ICGzipCompress(image);
 
                     // 創建文件流,path參數是文件路徑  
                     string strSQL2 =  " exec Insert_UpdateFile ' " + S +  " ',' " + fileVersion.FileVersion +  " ','',' " + file.Length +  " ',' " + file.CreationTime +  " ',' " + file.Extension +  " ',' " + SHA1 +  " ',' " + md5 +  " ',0x " + Byte2String(args0) +  "";
                     // string strSQL2 = "exec Insert_UpdateFile '" + S + "','" + fileVersion.FileVersion + "','','" + file.Length + "','" + file.CreationTime + "','" + file.Extension + "','" + SHA1 + "','" + md5 + "',0x" + Byte2String(image) + "";
 
                     int k = W1.DC(strSQL2,  " Sys ");
 
                    if (k> 0)
                    {
                        MessageBox.Show( " 成功! "" 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                     else
                    {
                        MessageBox.Show( " 失敗! "" 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }          
 
                }
                 catch
                {
 
                    MessageBox.Show( " 文件插入數據庫失敗!文件可能正在占用!! ", " 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
 
                ListDate();
 
            }
 
         
        }
 
         private  void dgvList_CellClick( object sender, DataGridViewCellEventArgs e)
        {
             //  ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            txtID.Text = dgvList[ 1, e.RowIndex].Value.ToString();
            txtFilePath.Text = dgvList[ 8, e.RowIndex].Value.ToString();
            chkUpdateBit.Checked = Convert.ToBoolean(dgvList[ 10, e.RowIndex].Value);
            chkRegBit.Checked = Convert.ToBoolean(dgvList[ 11, e.RowIndex].Value);
        }
 
         private  void btnCancel_Click( object sender, EventArgs e)
        {
             this.Close();
 
        }
 
         private  void btnSave_Click( object sender, EventArgs e)
        {
 
             string strSQL2 =  " Update SysUpdate set FilePath=' " + txtFilePath.Text +  " ',UpdateBit=' " + Convert.ToBoolean(chkUpdateBit.Checked) +  " ',RegBit=' " + Convert.ToBoolean(chkRegBit.Checked) +  " ' where ID=' " + txtID.Text +  " ';   ";
             int k = W1.DC(strSQL2,  " Sys ");
             if (k >  0)
            {
                MessageBox.Show( " 更新成功! "" 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
             else
            {
                MessageBox.Show( " 更新失敗! "" 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
 
        }
 
         private  void btnDel_Click( object sender, EventArgs e)
        {
             string strSQL2 =  " DELETE SysUpdate Where ID=' " + txtID.Text +  " ';   ";
             int k = W1.DC(strSQL2,  " Sys ");
 
             if (k >  0)
            {
                MessageBox.Show( " 刪除成功! "" 成功提示! ", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
             else
            {
                MessageBox.Show( " 刪除失敗! "" 錯誤提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ListDate();
        }
 
         private  void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
        {
             for ( int i =  0; i <  this.dgvList.Rows.Count; )
            {
                 this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml "" Color "" IMColor "))); ; //  pParentWin.globalcolor2;
                i +=  2;
            }
        }
 
 
         /// <summary>
        
///  序列化
        
///   </summary>
        
///   <param name="data"> 要序列化的對象 </param>
        
///   <returns> 返回存放序列化后的數據緩沖區 </returns>
         public  static  byte[] Serialize( object data)
        {
            BinaryFormatter formatter =  new BinaryFormatter();
            MemoryStream rems =  new MemoryStream();
            formatter.Serialize(rems, data);
             return rems.GetBuffer();
        }
 
         ///   <summary>
        
///  反序列化
        
///   </summary>
        
///   <param name="data"> 數據緩沖區 </param>
        
///   <returns> 對象 </returns>
         public  static  object Deserialize( byte[] data)
        {
            BinaryFormatter formatter =  new BinaryFormatter();
            MemoryStream rems =  new MemoryStream(data);
            data =  null;
             return formatter.Deserialize(rems);
        }
    }
}
View Code

4)   本地在線更新功能代碼:

namespace SysUpdate
{
     public  partial  class frmLocalUpdate :Form
    {
 
     
         private  string updateUrl =  string.Empty;
         private  string tempUpdatePath =  string.Empty;
        WinBase.Common W1 =  new WinBase.Common();
        //  private ECM.frmMain pParentWin = null;
    
         bool isRun =  false;
         bool isUpdate =  false;
         string mainAppExe =  "";
     
 
        //  public frmLocalUpdate(ECM.frmMain WinMain)
          public frmLocalUpdate()
        {
            InitializeComponent();
            //  pParentWin = WinMain;
        }
         private  void FrmSysUpdate_Load( object sender, EventArgs e)
        {
             // 數據庫SysUpdate表 顯示需要更新內容
            dgvList.ColumnCount =  10;
            dgvList.AutoGenerateColumns =  false;
            DataGridViewCheckBoxColumn newColumn =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 =  new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert( 0, newColumn);
            dgvList.Columns.Insert( 11, newColumn1);
            dgvList.Columns.Insert( 12, newColumn2);
             this.SetdgvListHeadText();
 
             string strSQL41 =  " SELECT * FROM SysUpdate order by ID ; ";
            DataSet ds = W1.DS(strSQL41, " Sys ");
            dgvList.DataSource = ds.Tables[ 0].DefaultView;
             this.DataBinding();
 
            dgvList.Columns[ 0].Frozen =  true;
            dgvList.Columns[ 1].Frozen =  true;
            dgvList.Columns[ 2].Frozen =  true;
            dgvList.Columns[ 3].Frozen =  true;
             //    dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
 
         private  void SetdgvListHeadText()
        {
            dgvList.Columns[ 0].HeaderText =  " 選擇 ";
            dgvList.Columns[ 0].Width =  50;
            dgvList.Columns[ 1].HeaderText =  " ID ";
            dgvList.Columns[ 1].Width =  20;
            dgvList.Columns[ 1].ReadOnly =  true;
            dgvList.Columns[ 2].HeaderText =  " 組件名 ";
            dgvList.Columns[ 2].Width =  120;
            dgvList.Columns[ 2].ReadOnly =  true;
            dgvList.Columns[ 3].HeaderText =  " 服務器版本號 ";
            dgvList.Columns[ 3].Width =  120;
            dgvList.Columns[ 3].ReadOnly =  true;
 
            dgvList.Columns[ 4].HeaderText =  " 本地版本號 ";
            dgvList.Columns[ 4].Width =  120;
            dgvList.Columns[ 4].ReadOnly =  true;
 
            dgvList.Columns[ 5].HeaderText =  " 大小 ";
            dgvList.Columns[ 5].Width =  100;
            dgvList.Columns[ 5].ReadOnly =  true;
            dgvList.Columns[ 6].HeaderText =  " 創建日期 ";
            dgvList.Columns[ 6].Width =  150;
            dgvList.Columns[ 6].ReadOnly =  true;
            dgvList.Columns[ 7].HeaderText =  " 哈希值 ";
            dgvList.Columns[ 7].Width =  250;
            dgvList.Columns[ 7].ReadOnly =  true;
            dgvList.Columns[ 8].HeaderText =  " MD5值 ";
            dgvList.Columns[ 8].Width =  250;
            dgvList.Columns[ 8].ReadOnly =  true;
            dgvList.Columns[ 9].HeaderText =  " 目錄 ";
            dgvList.Columns[ 9].Width =  80;
            dgvList.Columns[ 9].ReadOnly =  true;
            dgvList.Columns[ 10].HeaderText =  " 文件類型 ";
            dgvList.Columns[ 10].Width =  80;
            dgvList.Columns[ 10].ReadOnly =  true;
            dgvList.Columns[ 11].HeaderText =  " 是否更新 ";
            dgvList.Columns[ 11].Width =  80;
             //  dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[ 12].HeaderText =  " 是否需要注冊 ";
            dgvList.Columns[ 12].Width =  110;
             // dgvList.Columns[11].ReadOnly = true;
        }
 
 
         private  void DataBinding()
        {
 
             //  ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[ 0].DataPropertyName =  " Check1 ";
            dgvList.Columns[ 1].DataPropertyName =  " ID ";
            dgvList.Columns[ 2].DataPropertyName =  " FileName ";
            dgvList.Columns[ 3].DataPropertyName =  " FileVersion ";
 
            dgvList.Columns[ 5].DataPropertyName =  " FileSize ";
            dgvList.Columns[ 6].DataPropertyName =  " FileDate ";
            dgvList.Columns[ 7].DataPropertyName =  " FilesHash ";
            dgvList.Columns[ 8].DataPropertyName =  " FilesMD5 ";
            dgvList.Columns[ 9].DataPropertyName =  " FilePath ";
            dgvList.Columns[ 10].DataPropertyName =  " FileType ";
            dgvList.Columns[ 11].DataPropertyName =  " UpdateBit ";
            dgvList.Columns[ 12].DataPropertyName =  " RegBit ";
        }
 
 
         private  void btnCancel_Click( object sender, EventArgs e)
        {
             this.Close();
             //  Application.ExitThread();
            
//  Application.Exit();
        }
 
         private  void DataCheck()
        {
             // 檢查是否更新文件
             if (dgvList.Rows.Count !=  0)
            {
                 for ( int i =  0; i < dgvList.Rows.Count; i++)
                {
                   string fileName =  "";
                     string strg =  "";
                    fileName = dgvList.Rows[i].Cells[ 2].Value.ToString();
                    strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                     if (dgvList.Rows[i].Cells[ 9].Value.ToString() !=  "")
                    {
                        strg +=  " \\ " + dgvList.Rows[i].Cells[ 9].Value.ToString(); // 添加路徑信息
                    }
                    strg +=  " \\ " + fileName; // 添加文件名稱
 
                    
// 檢查文件是否存在
                    
// 文件版本號
                 
                   
//  FileInfo file = new FileInfo(strg);
                     if (FileUtil.IsExistFile(strg))
                    {
                         if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[ 8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[ 0].Value =  false;
                          
                        }
                         else
                        {
                            dgvList.Rows[i].Cells[ 0].Value =  true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[ 4].Value = fileVersion.FileVersion;
                    }
                     else
                    {
                        dgvList.Rows[i].Cells[ 0].Value =  true;
                        dgvList.Rows[i].Cells[ 4].Value =  " 文件不存在 ";
                    }
                  
                }
            }
        }
 
 
    
 
         private  delegate  void SetProgressVlue( int value);
         private  void SetValue( int value)  // 執行2次,第一次IF,第2次ELSE
        {
             if ( this.InvokeRequired)  // 是否處於控件線程外
            {
                SetProgressVlue d =  new SetProgressVlue(SetValue);  // 創建一個SetProgressVlue的委托實例d,並將SetVlue賦值
 
                 object arg = value;  // 給參數的值
                 this.Invoke(d, arg);  // 將該值傳遞給D
            }
             else
            {
                 this.pbDownFile.Value += value;
            }
        }
 
 
 
         private  void btnNext_Click( object sender, EventArgs e)
        {
              if (dgvList.Rows.Count ==  0)
             {
                  MessageBox.Show( " 沒有可用的更新! "" 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   return;
             }
              for ( int i =  0; i < dgvList.Rows.Count; i++)
             {
                  if (dgvList.Rows[i].Cells[ 0].Value ==  null)   // 第一次都是null
                 {
                     dgvList.Rows[i].Cells[ 0].Value =  false;
 
                 }
                  if ((dgvList.Rows[i].Cells[ 0].Value.ToString()) ==  " True ")
                 {
                     isUpdate =  true;
                 }
             }
              if (isUpdate== false)     
             {
                 MessageBox.Show( " 沒有可用的更新! "" 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             this.pbDownFile.Value =  0;
             string strSQL41 =  " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
            DataSet ds = W1.DS(strSQL41, " Sys ");
             // 檢查目錄對應文件MD5是否一樣,
            
// 如果一樣表示已經更新無需更新
             if (ds.Tables[ 0].Rows.Count >=  1)
            {
                pbDownFile.Maximum = ds.Tables[ 0].Rows.Count;
                 for ( int i =  0; i < ds.Tables[ 0].Rows.Count; i++)
                {
                    SetValue( 1);
                     string fileName =  "";
                     string strg =  "";
                    fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
                    strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                     if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() !=  "")
                    {
                        strg +=  " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
                    }
                    strg +=  " \\ " + fileName; // 添加文件名稱
 
                    
// 檢查文件是否存在
                     if (FileUtil.IsExistFile(strg))
                    {
                         if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
                        {
 
                        }
                         else
                        {
                            CloseMainExe();
                             // 刪除當前文件
                            FileUtil.DeleteFile(strg);
                             byte[] MyData2 =  new  byte[ 0];
                            MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
                             byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2); // 解壓
                            
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
                            FileStream fs =  new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0,  0, args0.Length);
                            fs.Close();
                             // 是否注冊
                             if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() ==  " True ")
                            {
                                Process p =  new Process();
                                p.StartInfo.FileName =  " Regsvr32.exe ";
                                p.StartInfo.Arguments =  " /s  " + strg; //
                            }
 
 
                        }
                    }
                     else
                    {
 
                         string DirectoryStrg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                         if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() !=  "")
                        {
                            DirectoryStrg +=  " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
                        }
 
                         if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                         else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                         byte[] MyData2 =  new  byte[ 0];
                        MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
                         byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                        //  MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
                        FileStream fs =  new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0,  0, args0.Length);
                        fs.Close();
 
                         if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() ==  " True ")
                        {
                            Process p =  new Process();
                            p.StartInfo.FileName =  " Regsvr32.exe ";
                            p.StartInfo.Arguments =  " /s  " + strg; //
                        }
 
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible =  false;
                panel2.Visible =  true;
                btnNext.Visible =  false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
         private  void CloseMainExe()
        {
             try
            {
                 string localXmlFile = Application.StartupPath +  " \\UpdateList.xml ";
                isRun = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AllowStart ").ToLower() ==  " true " ?  true : isRun;
                mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AppName ");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe """));
                 for ( int i =  0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                     for ( int j =  0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                     if (i == processesByName.Length -  1) Thread.Sleep( 550);
 
                }
 
            }
             catch
            {
                MessageBox.Show( " 關閉運行中的進程發生錯誤,請聯系管理員! "" 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
             // finally
            
// {
            
//     this.Close();
            
//     this.Dispose();
            
//      //   Application.ExitThread();
            
//      //   Application.Exit();
            
// }
        }
 
         private  void StarMainExe()
        {
             try
            {
                 string localXmlFile = Application.StartupPath +  " \\UpdateList.xml ";
                isRun =  false;
                mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AppName ");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe """));
                 for ( int i =  0; i < processesByName.Length; i++)
                {
                   if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                  {
                      isRun =  true;
                       break;
                  }
 
                }
 
                 if ( false ==  this.isRun) Process.Start(mainAppExe);
 
            }
             catch
            {
                MessageBox.Show( " 重啟主程序發生錯誤,請聯系管理員! "" 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
             finally
            {
                 this.Close();
                 this.Dispose();
                 //   Application.ExitThread();
                
//   Application.Exit();
            }
 
        }
         private  void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
        {
             for ( int i =  0; i <  this.dgvList.Rows.Count; )
            {
                 this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml "" Color "" IMColor "))); ; //  pParentWin.globalcolor2;
                i +=  2;
            }
        }
      
 
         private  void btnRefresh_Click( object sender, EventArgs e)
        {
             string strSQL41 =  " SELECT * FROM SysUpdate order by ID ; ";
            DataSet ds = W1.DS(strSQL41, " Sys ");
            dgvList.DataSource = ds.Tables[ 0].DefaultView;
             this.DataBinding();
            DataCheck();
        }
 
     
         private SysUpdate.frmSysUpdateUp frmsysupdateup =  null;
         private  void OpenUpload()
        {
             if (FindFormName( " frmSysUpdateUp ") ==  null)
            {
                frmsysupdateup =  new SysUpdate.frmSysUpdateUp(); ;
                frmsysupdateup.Show();
                frmsysupdateup.Focus();
            }
             else
            {
                Form f = FindFormName( " frmSysUpdateUp "as Form;
                f.Focus();
            }
        }
         ///   <summary> 在OpenForms中查找已經打開的窗口  </summary>      
        
///   <param name="text"> 傳入的窗口名稱 </param>       
        
///   <returns> 返回的窗口 </returns>    
         private Form FindFormName( string name)
        {
             foreach (Form form  in Application.OpenForms)
                 // 窗口名稱
                 if (form.Name == name)
                     return form;
             return  null;
        }
 
      
         private  void frmLocalUpdate_KeyPress( object sender, KeyPressEventArgs e)
        {
             if ((Control.ModifierKeys & Keys.Control) == Keys.Control && e.KeyChar== 19)
            {
                OpenUpload();
            }
        }
         // protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        
// {
        
//     if ((keyData & Keys.Alt) == Keys.Alt) // 檢測到alt
        
//     {
        
//         if ((keyData & Keys.Control) == Keys.Control)
        
//         {
        
//             System.Windows.Forms.SendKeys.Send("^%");
        
//             return true;
        
//         }
        
//     }
        
//     return base.ProcessCmdKey(ref msg, keyData);
        
// }
    
 
 
    }
}
View Code

5)   通過webservice在線更新功能代碼:

namespace SysUpdate
{
     public  partial  class frmOnlineUpdate : Form
    {
 
      
         private  string updateUrl =  string.Empty;
         private  string tempUpdatePath =  string.Empty;
        WinBase.Common W1 =  new WinBase.Common();
      
        DataSet ds1 =  new DataSet();
         bool isRun =  false;
         bool isUpdate =  false;
         string mainAppExe =  "";
      
 
         public frmOnlineUpdate()
        {
            InitializeComponent();
          
        }
         private  void frmOnlineUpdate_Load( object sender, EventArgs e)
        {
             // 數據庫SysUpdate表 顯示需要更新內容
            dgvList.ColumnCount =  10;
            dgvList.AutoGenerateColumns =  false;
            DataGridViewCheckBoxColumn newColumn =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn1 =  new DataGridViewCheckBoxColumn();
            DataGridViewCheckBoxColumn newColumn2 =  new DataGridViewCheckBoxColumn();
            dgvList.Columns.Insert( 0, newColumn);
            dgvList.Columns.Insert( 11, newColumn1);
            dgvList.Columns.Insert( 12, newColumn2);
             this.SetdgvListHeadText();
 
 
 
             string localXmlFile = Application.StartupPath +  " \\UpdateList.xml ";
            txtAddress.Text = W1.LoadXmlFileValue( " UpdateList.xml "" Updater "" Url ");          
            Down();
            dgvList.DataSource = ds1.Tables[ 0].DefaultView;
             this.DataBinding();
 
            dgvList.Columns[ 0].Frozen =  true;
            dgvList.Columns[ 1].Frozen =  true;
            dgvList.Columns[ 2].Frozen =  true;
            dgvList.Columns[ 3].Frozen =  true;
             //    dgvList.Columns[4].Frozen = true;
            DataCheck();
 
        }
         private  void Down()
        {
             string url = txtAddress.Text;
             #region 從服務器獲取更新列表
 
             object result = WebServicesHelper.InvokeWebService(url,  " GetUpdateFile "null);
             byte[] tb = ( byte[])result;
             object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
 
             for ( int i =  0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }
             #endregion
        }
           
 
           private  void SetdgvListHeadText()
        {
            dgvList.Columns[ 0].HeaderText =  " 選擇 ";
            dgvList.Columns[ 0].Width =  50;
            dgvList.Columns[ 1].HeaderText =  " ID ";
            dgvList.Columns[ 1].Width =  20;
            dgvList.Columns[ 1].ReadOnly =  true;
            dgvList.Columns[ 2].HeaderText =  " 組件名 ";
            dgvList.Columns[ 2].Width =  120;
            dgvList.Columns[ 2].ReadOnly =  true;
            dgvList.Columns[ 3].HeaderText =  " 服務器版本號 ";
            dgvList.Columns[ 3].Width =  120;
            dgvList.Columns[ 3].ReadOnly =  true;
 
            dgvList.Columns[ 4].HeaderText =  " 本地版本號 ";
            dgvList.Columns[ 4].Width =  120;
            dgvList.Columns[ 4].ReadOnly =  true;
 
            dgvList.Columns[ 5].HeaderText =  " 大小 ";
            dgvList.Columns[ 5].Width =  100;
            dgvList.Columns[ 5].ReadOnly =  true;
            dgvList.Columns[ 6].HeaderText =  " 創建日期 ";
            dgvList.Columns[ 6].Width =  150;
            dgvList.Columns[ 6].ReadOnly =  true;
            dgvList.Columns[ 7].HeaderText =  " 哈希值 ";
            dgvList.Columns[ 7].Width =  250;
            dgvList.Columns[ 7].ReadOnly =  true;
            dgvList.Columns[ 8].HeaderText =  " MD5值 ";
            dgvList.Columns[ 8].Width =  250;
            dgvList.Columns[ 8].ReadOnly =  true;
            dgvList.Columns[ 9].HeaderText =  " 目錄 ";
            dgvList.Columns[ 9].Width =  80;
            dgvList.Columns[ 9].ReadOnly =  true;
            dgvList.Columns[ 10].HeaderText =  " 文件類型 ";
            dgvList.Columns[ 10].Width =  80;
            dgvList.Columns[ 10].ReadOnly =  true;
            dgvList.Columns[ 11].HeaderText =  " 是否更新 ";
            dgvList.Columns[ 11].Width =  80;
             //  dgvList.Columns[10].ReadOnly = true;
            dgvList.Columns[ 12].HeaderText =  " 是否需要注冊 ";
            dgvList.Columns[ 12].Width =  110;
             // dgvList.Columns[11].ReadOnly = true;
        }
 
 
         private  void DataBinding()
        {
 
             //  ID, FileName, FileVersion, FilePath, FileData, FileSize, FileDate, FileType, FilesHash, FilesMD5, UpdateBit, RegBit
            dgvList.Columns[ 0].DataPropertyName =  " Check1 ";
            dgvList.Columns[ 1].DataPropertyName =  " ID ";
            dgvList.Columns[ 2].DataPropertyName =  " FileName ";
            dgvList.Columns[ 3].DataPropertyName =  " FileVersion ";
 
            dgvList.Columns[ 5].DataPropertyName =  " FileSize ";
            dgvList.Columns[ 6].DataPropertyName =  " FileDate ";
            dgvList.Columns[ 7].DataPropertyName =  " FilesHash ";
            dgvList.Columns[ 8].DataPropertyName =  " FilesMD5 ";
            dgvList.Columns[ 9].DataPropertyName =  " FilePath ";
            dgvList.Columns[ 10].DataPropertyName =  " FileType ";
            dgvList.Columns[ 11].DataPropertyName =  " UpdateBit ";
            dgvList.Columns[ 12].DataPropertyName =  " RegBit ";
        }
 
 
         private  void btnCancel_Click( object sender, EventArgs e)
        {
             this.Close();
             //  Application.ExitThread();
            
//  Application.Exit();
        }
 
         private  void DataCheck()
        {
             // 檢查是否更新文件
             if (dgvList.Rows.Count !=  0)
            {
                 for ( int i =  0; i < dgvList.Rows.Count; i++)
                {
                   string fileName =  "";
                     string strg =  "";
                    fileName = dgvList.Rows[i].Cells[ 2].Value.ToString();
                    strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                     if (dgvList.Rows[i].Cells[ 9].Value.ToString() !=  "")
                    {
                        strg +=  " \\ " + dgvList.Rows[i].Cells[ 9].Value.ToString(); // 添加路徑信息
                    }
                    strg +=  " \\ " + fileName; // 添加文件名稱
 
                    
// 檢查文件是否存在
                    
// 文件版本號
                 
                   
//  FileInfo file = new FileInfo(strg);
                     if (FileUtil.IsExistFile(strg))
                    {
                         if ((FileUtil.MD5File(strg).ToString()) == (dgvList.Rows[i].Cells[ 8].Value.ToString()))
                        {
                            dgvList.Rows[i].Cells[ 0].Value =  false;
                           
                        }
                         else
                        {
                            dgvList.Rows[i].Cells[ 0].Value =  true;
                        }
                        FileVersionInfo fileVersion = FileVersionInfo.GetVersionInfo(strg);
                        dgvList.Rows[i].Cells[ 4].Value = fileVersion.FileVersion;
                    }
                     else
                    {
                        dgvList.Rows[i].Cells[ 0].Value =  true;
                        dgvList.Rows[i].Cells[ 4].Value =  " 文件不存在 ";
                    }
                  
                }
            }
        }
 
 
    
 
         private  delegate  void SetProgressVlue( int value);
         private  void SetValue( int value)  // 執行2次,第一次IF,第2次ELSE
        {
             if ( this.InvokeRequired)  // 是否處於控件線程外
            {
                SetProgressVlue d =  new SetProgressVlue(SetValue);  // 創建一個SetProgressVlue的委托實例d,並將SetVlue賦值
 
                 object arg = value;  // 給參數的值
                 this.Invoke(d, arg);  // 將該值傳遞給D
            }
             else
            {
                 this.pbDownFile.Value += value;
            }
        }
 
 
 
         private  void btnNext_Click( object sender, EventArgs e)
        {
              if (dgvList.Rows.Count ==  0)
             {
                  MessageBox.Show( " 沒有可用的更新! "" 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   return;
             }
              for ( int i =  0; i < dgvList.Rows.Count; i++)
             {
                  if (dgvList.Rows[i].Cells[ 0].Value ==  null)   // 第一次都是null
                 {
                     dgvList.Rows[i].Cells[ 0].Value =  false;
 
                 }
                  if ((dgvList.Rows[i].Cells[ 0].Value.ToString()) ==  " True ")
                 {
                     isUpdate =  true;
                 }
             }
              if (isUpdate== false)     
             {
                 MessageBox.Show( " 沒有可用的更新! "" 自動更新 ", MessageBoxButtons.OK, MessageBoxIcon.Information);
                  return;
             }
             this.pbDownFile.Value =  0;
             string strSQL41 =  " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
            DataSet ds = W1.DS(strSQL41, " Sys ");
             // 檢查目錄對應文件MD5是否一樣,
            
// 如果一樣表示已經更新無需更新
             if (ds.Tables[ 0].Rows.Count >=  1)
            {
                pbDownFile.Maximum = ds.Tables[ 0].Rows.Count;
                 for ( int i =  0; i < ds.Tables[ 0].Rows.Count; i++)
                {
                    SetValue( 1);
                     string fileName =  "";
                     string strg =  "";
                    fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
                    strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                     if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() !=  "")
                    {
                        strg +=  " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
                    }
                    strg +=  " \\ " + fileName; // 添加文件名稱
                  
                    
// 檢查文件是否存在
                     if (FileUtil.IsExistFile(strg))
                    {
                         if ((FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
                        {
 
                        }
                         else
                        {
                            CloseMainExe();
                             // 刪除當前文件
                            FileUtil.DeleteFile(strg);
                             byte[] MyData2 =  new  byte[ 0];
                            MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
                             byte[] args0 = Common.SharpZip.DecompressB(MyData2); // 解壓
                            
// MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
                            FileStream fs =  new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                            fs.Write(args0,  0, args0.Length);
                            fs.Close();
                             // 是否注冊
                             if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() ==  " True ")
                            {
                                Process p =  new Process();
                                p.StartInfo.FileName =  " Regsvr32.exe ";
                                p.StartInfo.Arguments =  " /s  " + strg; //
                            }
 
 
                        }
                    }
                     else
                    {
 
                         string DirectoryStrg = Application.StartupPath.ToString(); // 得到應用程序路徑信息    
                         if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() !=  "")
                        {
                            DirectoryStrg +=  " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
                        }
 
                         if (DirectoryUtil.IsExistDirectory(DirectoryStrg))
                        {
                        }
                         else
                        {
                            DirectoryUtil.CreateDirectory(DirectoryStrg);
                        }
 
                         byte[] MyData2 =  new  byte[ 0];
                        MyData2 = ( byte[])ds.Tables[ 0].Rows[i][ " FileData "];
                         byte[] args0 = Common.SharpZip.ICGzipDecompress(MyData2);
                        //  MemoryStream mystream = new MemoryStream(Common.SharpZip.DecompressB(MyData2)); // 解壓
                        FileStream fs =  new FileStream(strg, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);
                        fs.Write(args0,  0, args0.Length);
                        fs.Close();
 
                         if (ds.Tables[ 0].Rows[i][ " RegBit "].ToString() ==  " True ")
                        {
                            Process p =  new Process();
                            p.StartInfo.FileName =  " Regsvr32.exe ";
                            p.StartInfo.Arguments =  " /s  " + strg; //
                        }
                       
                    }
 
                }
                DataCheck();
                panel2.Location = panel1.Location;
                panel2.Size = panel1.Size;
                panel1.Visible =  false;
                panel2.Visible =  true;
                btnNext.Visible =  false;
                StarMainExe();
                Application.Exit();
            }
 
        }
 
         private  void CloseMainExe()
        {
             try
            {
                 string localXmlFile = Application.StartupPath +  " \\UpdateList.xml ";
                isRun = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AllowStart ").ToLower() ==  " true " ?  true : isRun;
                mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AppName ");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe """));
                 for ( int i =  0; i < processesByName.Length; i++)
                {
                    Process p = processesByName[i];
                     for ( int j =  0; j < p.Threads.Count; j++)
                    {
                        p.Threads[j].Dispose();
                    }
                    p.Kill();
                     if (i == processesByName.Length -  1) Thread.Sleep( 550);
 
                }
              
            }
             catch
            {
                MessageBox.Show( " 關閉運行中的進程發生錯誤,請聯系管理員! "" 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
             // finally
            
// {
            
//     this.Close();
            
//     this.Dispose();
            
//    //   Application.ExitThread();
            
//    //   Application.Exit();
            
// }
        }
 
         private  void StarMainExe()
        {
             try
            {
                 string localXmlFile = Application.StartupPath +  " \\UpdateList.xml ";
                isRun =  false;
                mainAppExe = W1.LoadXmlFileValue( " UpdateList.xml "" Application "" AppName ");
                Process[] processesByName = Process.GetProcessesByName(mainAppExe.Replace( " .exe """));
                 for ( int i =  0; i < processesByName.Length; i++)
                {
                     if (processesByName[i].ToString().ToLower() == mainAppExe.ToString().ToLower())
                    {
                        isRun =  true;
                         break;
                    }
 
                }
 
                 if ( true ==  this.isRun) Process.Start(mainAppExe);
 
            }
             catch
            {
                MessageBox.Show( " 重啟主程序發生錯誤,請聯系管理員! "" 系統提示 ", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
             finally
            {
                 this.Close();
                 this.Dispose();
                 //   Application.ExitThread();
                
//   Application.Exit();
            }
 
        }
 
         private  void dgvList_DataBindingComplete( object sender, DataGridViewBindingCompleteEventArgs e)
        {
             for ( int i =  0; i <  this.dgvList.Rows.Count; )
            {
                 this.dgvList.Rows[i].DefaultCellStyle.BackColor = System.Drawing.Color.FromArgb(Convert.ToInt32(W1.LoadXmlFileValue( " config.xml "" Color "" IMColor "))); ; //  pParentWin.globalcolor2; // System.Drawing.Color.FromArgb(Convert.ToInt32(-2302756)); //
                i +=  2;
            }
        }
      
 
         private  void btnRefresh_Click( object sender, EventArgs e)
        {
            Down();
            dgvList.DataSource = ds1.Tables[ 0].DefaultView;
             this.DataBinding();
            DataCheck();
        }
      
 
 
    }
}
View Code

6)   軟件商webserice代碼

namespace HostWebService
{
     ///   <summary>
    
///  Summary description for Service1
    
///   </summary>
    //  [WebService(Namespace = " http://tempuri.org/ ")]
    [WebService(Namespace =  " http://localhost/sysupdate/SysUpdate.asmx/ ")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem( false)]
     //  To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    
//  [System.Web.Script.Services.ScriptService]

     public  class HostService : System.Web.Services.WebService
    {
        WebBase W1 =  new WebBase();
         #region WebService Get Method
        
       
        [WebMethod(Description =  " 取得服務器上的相關更新資料DataSet ")]
         public  byte[] GetUpdateFile()
        {
             string strSQL =  " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
            DataSet ds = W1.DS(strSQL,  " Sys ");
            DataTable[] tb =  new DataTable[ds.Tables.Count];
             for ( int i =  0; i < ds.Tables.Count; i++)
            {
                tb[i] = ds.Tables[i];

            }
             return Common.SharpZip.Compress(tb);
        }
      
       
         #endregion

         #region WebService Post Method
      
        [WebMethod(Description =  " 更新相關文件 ")]
         public  int UploadUpdateFile( byte[] result)
        {
             int id =  0;
             byte[] tb = ( byte[])result;
             object[] ob = Common.SharpZip.DecompressNew(tb);
            DataTable[] tb2 = (DataTable[])ob;
            DataSet ds1 =  new DataSet();
             for ( int i =  0; i < tb2.Length; i++)
            {
                ds1.Tables.Add(tb2[i]);
            }

             if (ds1.Tables[ 0].Rows.Count >  0)
            {

                 for ( int i =  0; i < ds1.Tables[ 0].Rows.Count; i++)
                {
                     string strSQL =  " select * from SysUpdate where ID=' " + ds1.Tables[ 0].Rows[i][ 0].ToString() +  " ' ";
                    DataSet ds10 = W1.DS(strSQL,  " Sys ");
                     if (ds10.Tables[ 0].Rows.Count >  0// 記錄已存在時
                    {
                        strSQL =  " Delete from SysUpdate where ID=' " + ds1.Tables[ 0].Rows[i][ 0].ToString() +  " '; Insert into SysUpdate values( ";
                         for ( int j =  0; j < ds1.Tables[ 0].Columns.Count -  1; j++)
                        {
                             if (ds1.Tables[ 0].Columns[j].DataType.ToString() ==  " System.Double " || ds1.Tables[ 0].Columns[j].DataType.ToString() ==  " System.Decimal ")   // Double型的要特別處理,不能看成字符型
                            {
                                 if (ds1.Tables[ 0].Rows[i][j].ToString() ==  "")
                                {

                                    strSQL +=  " null " +  " , ";
                                }
                                 else
                                {
                                    strSQL += ds1.Tables[ 0].Rows[i][j].ToString() +  " , ";
                                }
                            }
                             else
                            {
                                strSQL +=  " ' " + ds1.Tables[ 0].Rows[i][j].ToString() +  " ', ";
                            }
                        }
                        strSQL +=  " ' " + ds1.Tables[ 0].Rows[i][ds1.Tables[ 0].Columns.Count -  1].ToString() +  " ') ";
                         try
                        {
                            W1.DC(strSQL,  " Sys ");
                            id++;

                        }
                         catch
                        {
                             return id = - 1;
                        }
                    }
                     else
                    {
                        strSQL =  "  Insert into SysUpdate values( ";
                         for ( int j =  0; j < ds1.Tables[ 0].Columns.Count -  1; j++)
                        {
                             if (ds1.Tables[ 0].Columns[j].DataType.ToString() ==  " System.Double " || ds1.Tables[ 0].Columns[j].DataType.ToString() ==  " System.Decimal ")   // Double型的要特別處理,不能看成字符型
                            {
                                 if (ds1.Tables[ 0].Rows[i][j].ToString() ==  "")
                                {

                                    strSQL +=  " null " +  " , ";
                                }
                                 else
                                {
                                    strSQL += ds1.Tables[ 0].Rows[i][j].ToString() +  " , ";
                                }
                            }
                             else
                            {
                                strSQL +=  " ' " + ds1.Tables[ 0].Rows[i][j].ToString() +  " ', ";
                            }
                        }
                        strSQL +=  " ' " + ds1.Tables[ 0].Rows[i][ds1.Tables[ 0].Columns.Count -  1].ToString() +  " ') ";
                         try
                        {
                            W1.DC(strSQL,  " Sys ");
                            id++;

                        }
                         catch
                        {
                             return id = - 1;
                        }
                    }
                }

            }

             return id;
        }
      
     
         #endregion

         private  void InitializeComponent()
        {
        }
       
    }
}
View Code

7)   更新配置文件:UpdateList.xml

<?xml version= " 1.0 " encoding= " gb2312 "?>
<Configs>
  <Updater>
    <Url>http: // 218.X.X.2/sysupdate/HostService.asmx</Url>  // 升級文件所在服務器端的網址  
  </Updater>
  <Application>
    <AllowStart> true</AllowStart>  // 允許重新啟動應用程序
    <AppName>ECM.exe</AppName>   // 啟動的應用程序名  
  </Application>
</Configs>
View Code

8)   ECM系統Login時檢查是否有更新檔功能代碼:

   private  void CheckUpdate()
        {
              string strSQL41 =  " SELECT * FROM SysUpdate where UpdateBit=1 order by ID; ";
             DataSet ds = W1.DS(strSQL41, " Sys ");
             // 檢查目錄對應文件MD5是否一樣,
            
// 如果一樣表示已經更新無需更新
              if (ds.Tables[ 0].Rows.Count >=  1)
             {
                  for ( int i =  0; i < ds.Tables[ 0].Rows.Count; i++)
                 {
 
                      string fileName =  "";
                      string strg =  "";
                     fileName = ds.Tables[ 0].Rows[i][ " FileName "].ToString();
                     strg = Application.StartupPath.ToString(); // 得到應用程序路徑信息   
                      if (ds.Tables[ 0].Rows[i][ " FilePath "].ToString() !=  "")
                     {
                         strg +=  " \\ " + ds.Tables[ 0].Rows[i][ " FilePath "].ToString(); // 添加路徑信息
                     }
                     strg +=  " \\ " + fileName; // 添加文件名稱
 
                     
// 檢查文件是否存在
                      if (SysUpdate.FileUtil.IsExistFile(strg))
                     {
                          if ((SysUpdate.FileUtil.MD5File(strg).ToString()) == (ds.Tables[ 0].Rows[i][ " FilesMD5 "].ToString()))
                         {
                         }
                          else
                         {
                             isUpdate =  true;
 
                         }
                     }
                      else
                     {
                         isUpdate =  true;
                     }
 
                 }
             }
              if (isUpdate)
             {
                  if (MessageBox.Show( " 服務器存在更新版本,是否更新為最新版 "" 系統提示 ", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                 {
                     System.Diagnostics.Process.Start( " SysUpdate.exe ");
                 }
             }
        }
View Code

 

5、 有關更多的技術分享,大家可以加入我們的技術群,進行源碼的分享。

 

歡迎加入技術分享群:238916811

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM