天天看點

WINCE 軟體更新功能實作

WINCE裝置下的一個主程式,需要更新

Mai.exe // 自身需要運作的主程式

Update.exe    // 用以更新的外持式程式 

思路:

1,寫一個外部的.exe外挂式程式(我這名叫Update.exe)放置在主程式(QdPca.exe)運作的目錄下

2,在主程式中觸發更新或其它外部觸發方式,說白了就是啟動 Update.exe

3,在Update.exe中 

   判斷 如果主程式在運作,則關閉主程式(因為如果主程式沒有關閉,會導緻下面的檔案覆寫失敗)

   確定主程式關閉後,從放置最新主程式及主程式所需要檔案的目錄中複制或剪切所有檔案到主程式運作目錄上

   覆寫成功後,重新啟動主程式(QdPca.exe)并關閉自身(Update.exe)

其中使用了一個寫好的類,用以擷取目前正在運作的程式的程序,

具體使用方法見我的上一篇部落格:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Collections;

using Terranova.API;

namespace AppUpdate
{
    public partial class AppUpdate : Form
    {


        public AppUpdate()
        {
            InitializeComponent();

            // 關閉 QdPca主程式
            bool result = ProcessCE.IsRunning(@"\ResidentFlash2\QdPca\QdPca.exe");
            if (result == true)
            {
                // 如果發現主程式在運作,則關閉主程式
                bool ret = ProcessCE.FindAndKill(@"\ResidentFlash2\QdPca\QdPca.exe");
                if (ret == false)
                {
                    // 沒有發現主程式
                    // 如果關閉失敗,則抛出異常
                }
            }

          
            // 将所有要更新的檔案放置到指定目錄下
            DirectoryInfo theFolder = new DirectoryInfo("\\ResidentFlash2\\QdPca\\update\\");
            scan(theFolder);

       

            // 啟動主程式
            Process p = new Process();
            p.StartInfo.FileName = "\\ResidentFlash2\\QdPca\\QdPca.exe";
            p.Start();


            // 關閉自身
            Process.GetCurrentProcess().Kill();

        }

        private void copy(string sPathName, string dPathName)
        {
            //原路徑  
            //拷貝到路徑  


            //初始化1  
            FileInfo soufile = new FileInfo(sPathName);
            //初始化2   
            FileInfo dest = new FileInfo(dPathName);

            try
            {
                //如果拷貝的路徑有這個檔案 就删除  
                if (dest.Exists) dest.Delete();
                //執行拷貝到xx  
                soufile.CopyTo(dPathName, true);

            }
            catch (Exception ex)
            {

                MessageBox.Show("拷貝錯誤" + ex.ToString());
            } 
        }

        //掃描方法  
        private void scan(FileSystemInfo info)
        {
            if (!info.Exists) 
                return;

            DirectoryInfo dir = info as DirectoryInfo;
            //不是目錄  
            if (dir == null) 
                return;
            
            String dPath = "\\ResidentFlash2\\QdPca\\";

            FileSystemInfo[] files = dir.GetFileSystemInfos();

            for (int i = 0; i < files.Length; i++)
            {
                FileInfo file = files[i] as FileInfo;
                //是檔案  
                if (file != null)
                {
                    copy(file.FullName, dPath+file.Name);

                }
                else scan(files[i]);
            }



        }//end scan
    }
}      

繼續閱讀