版本自动更新程序及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; } }//下载失败的文件总数
}

你可能感兴趣的:(下载)