版本自动更新程序及3种实现策略(二)下载器实现

http://www.vjsdn.com/bbs/bbsTopicDetails.aspx?pid=597


续上项目介绍及UML图解
版本自动更新程序及3种实现策略
(一)
 

版本自动更新程序及3种实现策略程序下载(附源码) 

下面是三种下载器代码实现

局域网复制文件下载器
/// <summary> 
/// 局域网复制文件下载器。 
/// </summary> 
public class LAN_Downloader : IDownloader
{
   private XmlLoader _serverXmlObj;
   private XmlLoader _clientXmlObj;
   private bool _inited = false;//已经初始下载器 
   
   public XmlLoader XmlServer { get { return _serverXmlObj; } }
   public XmlLoader XmlLocal { get { return _clientXmlObj; } }
   // public int DownloadCount { get;} 
   
   public void Init() //初始化下载器
   {
      //服务器上的文件清单保存在本机的文件名 
      string serverXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      //本地最后一次更新记录 
      string clientXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ClientFilesXml;
      
      this.DownloadServerXml(); //下载服务器上文件清单,用于与本机的文件清单比较 
      
      if (!File.Exists(clientXml)) XmlLoader.CreateEmpty(clientXml);
      
      _serverXmlObj = new XmlLoader(serverXml); //创建服务器xml解释器 
      _clientXmlObj = new XmlLoader(clientXml); //创建本地xml解释器 
      
      _inited = true;
   }
   
   public void DownloadServerXml()
   {
      //服务器上的文件清单 
      string serverXml = AppSettings.Instance.ServerSharedFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      //服务器上的文件清单保存在本机的文件名 
      string serverXml_Local = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      if (File.Exists(serverXml_Local)) File.Delete(serverXml_Local);//删除临时文件 
      
      File.Copy(serverXml, serverXml_Local);//把更新列表复制到本机 
   }
   
   //下载所有文件 
   public void Download()
   {
      if (false == _inited) return;//没有初始化下载器,不执行操作。 
      
      IList files = _serverXmlObj.GetFiles();
      _progress.Maximum = files.Count + 1;
      _progress.Minimum = 1;
      _progress.Value = 1;
      foreach (FileInfo file in files)
      {
         bool update = _clientXmlObj.CompareFile(file); //比较文件最后修改日期 
         if (update)
         {
            FileInfo local = this.DownloadFile(file);
            if (local != null)
            {
               _clientXmlObj.AddOrUpdateHistory(file, local);
               _DownloadsCount++;//下载成功文件计数器+1 
            }
            else
            {
               _DownloadFaliedCount++;//下载失败文件计数器+1 
            }
         }
         _progress.Value += 1;
      }
      
      _clientXmlObj.SetLastUpdateInfo(_serverXmlObj.GetVersion(), DateTime.Now);
      _clientXmlObj.Save();//保存xml文件 
   }
   
   private ToolStripProgressBar _progress = null;
   public void SetProgressBar(ToolStripProgressBar progress)
   {
      _progress = progress;
   }
   
   private ListBox _logList = null;
   public void SetTrace(ListBox logList)
   {
      _logList = logList;
   }
   
   //file.FullPath=\a.xml ->当前目录 
   //file.FullPath=\Dir\a.xml -子目录下的文件 
   //下载单个文件 
   public FileInfo DownloadFile(FileInfo file)
   {
      try
      {
         string folder = AppSettings.Instance.ClientSaveFolder;
         string shared = AppSettings.Instance.ServerSharedFolder;
         
         string from = shared + file.FullPath.Replace(@".\", @"\");
         string dest = folder + file.FullPath.Replace(@".\", @"\");
         
         PrepareFile(dest);//如目录不存在-建立,如文件存在-删除. 
         
         File.Copy(from, dest); //把文件复制到本机 
         
         if (_logList != null) _logList.Items.Add("已下载文件:" + file.FullPath);
         
         //返回复制的文件。 
         return new FileInfo(file.Name, from, file.ModifyTime);
      }
      catch
      {
         return null;
      }
   }
   
   private void PrepareFile(string file)
   {
      if (file.Trim() == "") return;
      string dir = Path.GetDirectoryName(file);
      if (!Directory.Exists(dir)) //目录不存在-建立目录
      Directory.CreateDirectory(dir);
      else //文件存在-删除文件.
      if (File.Exists(file)) File.Delete(file);
   }
   
   private int _DownloadsCount = 0;
   public int DownloadsCount { get { return _DownloadsCount; } } //下载成功的文件总数
   
   private int _DownloadFaliedCount = 0;
   public int DownloadFaliedCount { get { return _DownloadFaliedCount; } }//下载失败的文件总数
}

WebClient组件下载器
/// <summary> 
/// 通过Web方式下载 
/// </summary> 
public class WebClient_Downloader : IDownloader
{
   private WebClient _webClient;
   private XmlLoader _serverXmlObj;
   private XmlLoader _clientXmlObj;
   private bool _inited = false;//已经初始下载器 
   
   public XmlLoader XmlServer { get { return _serverXmlObj; } }
   public XmlLoader XmlLocal { get { return _clientXmlObj; } }
   
   public void Init() //初始化下载器
   {
      _webClient = new WebClient();
      
      //服务器上的文件清单保存在本机的文件名 
      string serverXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      //本地最后一次更新记录 
      string clientXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ClientFilesXml;
      
      this.DownloadServerXml(); //下载服务器上文件清单,用于与本机的文件清单比较 
      
      if (!File.Exists(clientXml)) XmlLoader.CreateEmpty(clientXml);
      
      _serverXmlObj = new XmlLoader(serverXml); //创建服务器xml解释器 
      _clientXmlObj = new XmlLoader(clientXml); //创建本地xml解释器 
      
      _inited = true;
   }
   
   
   public FileInfo DownloadFile(FileInfo file) //下载单个文件
   {
      try
      {
         string folder = AppSettings.Instance.ClientSaveFolder;
         string url = AppSettings.Instance.ServerPublishUrl;
         
         string from = url + file.FullPath.Replace(@".\", @"/");
         string dest = folder + file.FullPath.Replace(@".\", @"\");
         
         PrepareFile(dest);//如目录不存在-建立,如文件存在-删除. 
         
         //把文件复制到本机 
         byte[] bs = _webClient.DownloadData(from);
         FileStream fs = File.Open(dest, FileMode.OpenOrCreate, FileAccess.Write);
         fs.Write(bs, 0, bs.Length);
         fs.Flush();
         fs.Close();
         
         if (_logList != null) _logList.Items.Add("已下载文件:" + file.FullPath);
         
         //返回复制的文件。 
         return new FileInfo(file.Name, from, file.ModifyTime);
      }
      catch
      {
         return null;
      }
   }
   
   private void PrepareFile(string file)
   {
      if (file.Trim() == "") return;
      string dir = Path.GetDirectoryName(file);
      if (!Directory.Exists(dir)) //目录不存在-建立目录
      Directory.CreateDirectory(dir);
      else //文件存在-删除文件.
      if (File.Exists(file)) File.Delete(file);
   }
   
   //下载所有文件 
   public void Download()
   {
      if (false == _inited) return;//没有初始化下载器,不执行操作。 
      
      IList files = _serverXmlObj.GetFiles();
      _progress.Maximum = files.Count + 1;
      _progress.Minimum = 1;
      _progress.Value = 1;
      foreach (FileInfo file in files)
      {
         bool update = _clientXmlObj.CompareFile(file); //比较文件最后修改日期 
         if (update)
         {
            FileInfo local = this.DownloadFile(file);
            if (local != null)
            {
               _clientXmlObj.AddOrUpdateHistory(file, local);
               _DownloadsCount++;//下载成功文件计数器+1 
            }
            else
            {
               _DownloadFaliedCount++;//下载失败文件计数器+1 
            }
         }
         
         _progress.Value += 1;
      }
      _clientXmlObj.SetLastUpdateInfo(_serverXmlObj.GetVersion(), DateTime.Now);
      _clientXmlObj.Save();//保存xml文件 
   }
   
   public void DownloadServerXml()
   {
      //服务器上的文件清单 
      string serverXml = AppSettings.Instance.ServerPublishUrl + "/" + AppSettings.Instance.ServerFilesXml;
      
      //服务器上的文件清单保存在本机的文件名 
      string serverXml_Local = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      if (File.Exists(serverXml_Local)) File.Delete(serverXml_Local);//删除临时文件 
      
      WebClient client = new WebClient();
      
      client.DownloadFile(serverXml, serverXml_Local);
   }
   
   private ToolStripProgressBar _progress = null;
   public void SetProgressBar(ToolStripProgressBar progress)
   {
      _progress = progress;
   }
   
   private ListBox _logList = null;
   public void SetTrace(ListBox logList)
   {
      _logList = logList;
   }
   
   private int _DownloadsCount = 0;
   public int DownloadsCount { get { return _DownloadsCount; } } //下载成功的文件总数
   
   private int _DownloadFaliedCount = 0;
   public int DownloadFaliedCount { get { return _DownloadFaliedCount; } }//下载失败的文件总数
}

Tcp/IP下载器

/// <summary> 
/// Tcp/ip远程下载 
/// </summary> 
public class TcpIp_Downloader : IDownloader
{
   private UpgraderClient _UpgraderClient;
   
   private XmlLoader _serverXmlObj;
   private XmlLoader _clientXmlObj;
   private bool _inited = false;//已经初始下载器 
   
   public XmlLoader XmlServer { get { return _serverXmlObj; } }
   public XmlLoader XmlLocal { get { return _clientXmlObj; } }
   
   public void Init() //初始化下载器
   {
      _UpgraderClient = new UpgraderClient(null);
      
      //服务器上的文件清单保存在本机的文件名 
      string serverXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ServerFilesXml;
      
      //本地最后一次更新记录 
      string clientXml = AppSettings.Instance.ClientSaveFolder + "\\" + AppSettings.Instance.ClientFilesXml;
      
      this.DownloadServerXml(); //下载服务器上文件清单,用于与本机的文件清单比较 
      
      if (!File.Exists(clientXml)) XmlLoader.CreateEmpty(clientXml);
      
      _serverXmlObj = new XmlLoader(serverXml); //创建服务器xml解释器 
      _clientXmlObj = new XmlLoader(clientXml); //创建本地xml解释器 
      
      _inited = true;
   }
   
   public FileInfo DownloadFile(FileInfo file) //下载单个文件
   {
      try
      {
         string from = AppSettings.Instance.ServerPublishFolder + file.FullPath.Replace(@".\", @"\");
         string dest = AppSettings.Instance.ClientSaveFolder + file.FullPath.Replace(@".\", @"\");
         
         PrepareFile(dest);//如目录不存在-建立,如文件存在-删除. 
         
         bool ret = _UpgraderClient.DownloadFile(from, dest); //把文件复制到本机 
         
         //返回复制的文件。 
         if (ret)
         {
            if (_logList != null) _logList.Items.Add("已下载文件:" + file.FullPath);
            return new FileInfo(file.Name, from, file.ModifyTime);
         }
         else
         {
            if (_logList != null) _logList.Items.Add("下载文件:" + file.FullPath + "失败!");
            return null;
         }
      }
      catch
      {
         return null;
      }
   }
   
   //下载所有文件 
   public void Download()
   {
      if (false == _inited) return;//没有初始化下载器,不执行操作。 
      
      IList files = _serverXmlObj.GetFiles();
      _progress.Maximum = files.Count + 1;
      _progress.Minimum = 1;
      _progress.Value = 1;
      foreach (FileInfo file in files)
      {
         bool update = _clientXmlObj.CompareFile(file); //比较文件最后修改日期 
         if (update)
         {
            FileInfo local = this.DownloadFile(file);
            if (local != null)
            {
               _clientXmlObj.AddOrUpdateHistory(file, local);
               _DownloadsCount++;//下载成功文件计数器+1 
            }
            else
            {
               _DownloadFaliedCount++;//下载失败文件计数器+1 
            }
         }
         
         _progress.Value += 1;
      }
      
      _clientXmlObj.SetLastUpdateInfo(_serverXmlObj.GetVersion(), DateTime.Now);
      _clientXmlObj.Save();//保存xml文件 
   }
   
   public void DownloadServerXml()
   {
      //服务器上的文件清单. 
      string serverXml = AppSettings.Instance.ServerPublishFolder + @"\" + AppSettings.Instance.ServerFilesXml;
      
      //服务器上的文件清单保存在本机的文件名 
      string serverXml_Local = AppSettings.Instance.ClientSaveFolder + @"\" + AppSettings.Instance.ServerFilesXml;
      
      if (File.Exists(serverXml_Local)) File.Delete(serverXml_Local);//删除临时文件 
      
      bool ret = _UpgraderClient.DownloadFile(serverXml, serverXml_Local);//把更新列表复制到本机 
      if (false == ret) throw new Exception("不能下载文件列表!\n可能是xml文件不存在或没有启动tcp/ip服务!");
   }
   
   private ToolStripProgressBar _progress = null;
   public void SetProgressBar(ToolStripProgressBar progress)
   {
      _progress = progress;
   }
   
   
   private void PrepareFile(string file)
   {
      if (file.Trim() == "") return;
      string dir = Path.GetDirectoryName(file);
      if (!Directory.Exists(dir)) //目录不存在-建立目录
      Directory.CreateDirectory(dir);
      else //文件存在-删除文件.
      if (File.Exists(file)) File.Delete(file);
   }
   
   private ListBox _logList = null;
   public void SetTrace(ListBox logList)
   {
      _logList = logList;
   }
   
   private int _DownloadsCount = 0;
   public int DownloadsCount { get { return _DownloadsCount; } } //下载成功的文件总数
   
   private int _DownloadFaliedCount = 0;
   public int DownloadFaliedCount { get { return _DownloadFaliedCount; } }//下载失败的文件总数
}

posted @ 2009-09-25 09:55  海浪~~  阅读(1208)  评论(0编辑  收藏  举报