c#如何實現自動更新


更新思想:根據url下載安裝包,再在本地解壓,將圖標在桌面顯示。自動更新的時候使用后台線程(當程序退出的時候,線程也退出)。

 private void lbVersion_Click(object sender, RoutedEventArgs e)//設置一個按鈕來確定是否自動更新
        {
            AutoUpdateManager.AutoUpdate();
        }

    public static void AutoUpdate()//將程序放入線程池中(線程池線程默認為后台線程, 應用程序的主線程以及使用Thread構造的線程都默認為前台線程,線程池線程也就是使用 ThreadPool.QueueUserWorkItem()和Task工廠創建的線程都默認為后台線程)
         {
              ThreadPool.QueueUserWorkItem(CheckUpdateAction);
         }

  private static void CheckUpdateAction(object state)
        {
            if (state != null)//這里沒啥用,防止以后加功能
            {
                Thread.CurrentThread.Priority = (ThreadPriority)state;
                
            }
            {
                WorkFileService service = new WorkFileService();//new一個類
                WorkFile file = service.NetDownAutoUpdateFiles(ConfigurationManager.AppSettings["fileBigType"], ConfigurationManager.AppSettings["fileSmallType"], CurVersion);//根據URL下載信息,根據Http下載,代碼在下面
                if (file != null && !string.IsNullOrEmpty(file.fileNo))
                {
                    if (!Directory.Exists(AppDomain.CurrentDomain.BaseDirectory + @"DownFiles\"))//穿件一個文件夾放安裝程序
                    {
                        Directory.CreateDirectory(AppDomain.CurrentDomain.BaseDirectory + @"DownFiles\");
                    }
                    string path = MakeTempUpdateAction(Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"DownFiles\", file.fileName));//解壓程序,並在桌面上放圖標
                    if (OnUpdated != null)
                    {
                        OnUpdated.Invoke(file.fileName.Replace(".zip", "").Replace(".rar", ""), path);
                    }
                }
                else
                {
                    if (OnUpdated != null)
                    {
                        OnUpdated.Invoke(string.Empty, string.Empty);
                    }
                }
            }
        }

public class WorkFile : EntityBase
{
/// <summary>
/// 文件ID
/// </summary>
public int fileId
{ get; set; }
/// <summary>
/// 文件編號
/// </summary>
public string fileNo
{ get; set; }
/// <summary>
/// 文件類型
/// </summary>
public int fileType
{ get; set; }
/// <summary>
/// 文件名
/// </summary>
public string fileName
{ get; set; }
/// <summary>
/// 文件拓展名
/// </summary>
public string extension
{ get; set; }
/// <summary>
/// 文件大小
/// </summary>
public int fileSize
{ get; set; }
/// <summary>
/// 文件路徑
/// </summary>
public string filePath
{ get; set; }
/// <summary>
/// 數據標識
/// </summary>
public int dataFlag
{ get; set; }
/// <summary>
/// 文件MD5碼
/// </summary>
public string md5
{ get; set; }
/// <summary>
/// 機台類型
/// </summary>
public string machineType
{ get; set; }
/// <summary>
/// 文件分組Id
/// </summary>
public int groupId
{ get; set; }
/// <summary>
/// 拓展Json
/// </summary>
public string json
{ get; set; }
/// <summary>
/// 文件順序
/// </summary>
public int rowNum
{ get; set; }
/// <summary>
/// 版本
/// </summary>
public string version
{ get; set; }
}

 
          
  public WorkFile NetDownAutoUpdateFiles(string big, string small, string version)//下載程序
        {
            WorkFile file = new WorkFile();
            string result = HttpClient.DownLoadData(ConfigurationManager.AppSettings["API_AutoUpdateProgram"], new { fileBigType = big, fileSmallType = small, fileVersion = version });//代碼后面后
            if (!string.IsNullOrEmpty(result))//若返回的數據不為空,反序列化到類中
            {
                var Msg = JsonHelper.Deserialize<ApiMessage<WorkFile>>(result);
                if (Msg != null)
                {
                    file = Msg.data;
                    if (file != null && !string.IsNullOrEmpty(file.fileNo))
                    {
                        if (HttpClient.HttpDownloadAutoUpdateFile(file.filePath, file.fileName, file.md5))//md5檢驗
                        {
                            rep.Add(file);
                        }
                        UnitOfWorkFile.Commit();//使用事務,防止下載到一半斷網了
                    }
                }
            }
            return file;
        }

public static string DownLoadData(string url, object requestData)//根據url下載,使用post傳輸,用webclient下載,未轉換成類,是json字符串

{
   string ret = string.Empty;
      try
           {
               if (!url.Contains("http"))
           {
               url = string.Format("http://{0}:{1}/{2}/{3}", ConfigurationManager.AppSettings["ApiServerHost"], ConfigurationManager.AppSettings["ApiServerPort"], ConfigurationManager.AppSettings["ApiPrefix"], url);
            }
             using (WebClient client = new WebClient())
           {
               client.Encoding = Encoding.UTF8;
               client.Headers.Add("Accept", "application/json");
               client.Headers.Add("Content-Type", "application/json");
               client.Headers.Add("Timeout", "5000");
               client.Headers.Add("Method", "POST");
               ret = client.UploadString(url, JsonHelper.Serialize(requestData));//下載數據
           }
                  }
catch (Exception ex)
{
}
return ret;
}

 
 
          
        /// <summary>
        /// HTTP下載文件
        /// </summary>
        /// <param name="url">Http相對路徑</param>
        /// <param name="fileName">文件名</param>
        /// <returns></returns>
        public static bool HttpDownloadAutoUpdateFile(string url, string fileName, string md5)
        {
            try
            {
 DownFilesPath = AppDomain.CurrentDomain.BaseDirectory + @"DownFiles\";//獲取文件基目錄
string filePath = DownFilesPath + fileName; using (WebClient client = new WebClient()) { url = url.Replace("192.168.50.100", ConfigurationManager.AppSettings["ApiServerHost"]); Uri uri = new Uri(string.Format("http://{0}/{1}", url, fileName)); client.DownloadFile(uri, filePath); //下載文件到指定目錄 } return CheckFileMd5ByFilePath(filePath, md5);//進行md5檢驗確定下載文件的正確性 } catch (Exception ex) { return false; } }
 /// <summary>
           /// md5校驗
           /// </summary>
           /// <param name="FilePath">文件路徑</param>
           /// <returns></returns>
        private static bool CheckFileMd5ByFilePath(string FilePath, string RightMd5)
        {
            bool Right = false;
            try
            {
                if (File.Exists(FilePath))
                {
                    using (System.IO.FileStream fileStream = new System.IO.FileStream(FilePath, System.IO.FileMode.Open))//用的本地路徑
                    {
                        using (System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider())
                        {
                            byte[] retVal = md5.ComputeHash(fileStream);
                            string filemd5 = string.Join("", retVal.Select(b => b.ToString("x2")).ToList());
                            Right = (filemd5 == RightMd5);
                        }
                        fileStream.Close();
                    }
                }
            }
            catch (Exception ex)
            { 
            }
            return Right;
        }
 
           

 

 
          

 

 
          
        /// <summary>
        /// 操作本地臨時壓縮文件更新程序
        /// </summary>
        /// <param name="zipFilePath">臨時壓縮文件位置</param>
        private static string MakeTempUpdateAction(string zipFilePath)
        {
            if (File.Exists(zipFilePath))
            {
                string ParentPath = Path.Combine(Path.GetFullPath("../.."),
                string.Format("{0}{1}", "MacCheck", DateTime.Now.ToString("yyMMddHHmm")));
                if (Directory.Exists(ParentPath))
                {
                    Directory.Delete(ParentPath, true);
                }
                Directory.CreateDirectory(ParentPath);
                if (ZipHelper.UnZip(zipFilePath, ParentPath))
                {
                    ParentPath = Path.Combine(ParentPath, "MacCheck.Bin");
                    File.Copy(Path.GetFullPath(@"MacCheck_DB.db"), Path.Combine(ParentPath, @"MacCheck_DB.db"), true);
                    File.Copy(Path.GetFullPath(@"MacCheck.exe.config"), Path.Combine(ParentPath, @"MacCheck.exe.config"), true);
                    //File.Copy(Path.GetFullPath(@"SupConConfig.json"), Path.Combine(ParentPath, @"SupConConfig.json"), true);
                    Utils.CreateShortCut("設備點巡檢", Path.Combine(ParentPath, @"MacCheck.exe"), ParentPath, "設備點檢程序");
                    return Path.Combine(ParentPath, @"MacCheck.exe");
                };
            }
            return string.Empty;
        }
 
          

  

 

 

 


免責聲明!

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



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