Generator
1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 5 namespace Downloader 6 { 7 public class Generator : StatusProcess 8 { 9 private readonly string _appPath = AppDomain.CurrentDomain.BaseDirectory; 10 protected void GenerateFileList(string dir, List<FileEntity> fileEntities) 11 { 12 var files = Directory.GetFiles(dir); 13 foreach (var tem in files) 14 { 15 var fileInfo = new FileInfo(tem); 16 var file = new FileEntity() 17 { 18 FileName = tem.Replace(_appPath, "").Replace("\", "\\"), 19 LastUpdate = fileInfo.LastWriteTime.ToString("yyyyMMddHHmmss") 20 }; 21 fileEntities.Add(file); 22 } 23 24 var directories = Directory.GetDirectories(dir); 25 foreach (var directory in directories) 26 { 27 GenerateFileList(directory, fileEntities); 28 } 29 } 30 31 public void GenerateFileList() 32 { 33 var filelist = new FileListEntity() { FileCode = Guid.NewGuid().ToString().ToUpper().Replace("-", "") }; 34 GenerateFileList(_appPath, filelist.FileEntities); 35 filelist.SerializeConfig(Path.Combine(_appPath, "filelist.xml")); 36 } 37 38 public void DownloadFileList(string path, string url, string customerCode, string token, string mac) 39 { 40 #region 请求filelist.xml 41 42 var client = new RestClient 43 { 44 EndPoint = url, 45 Method = HttpVerb.Post 46 }; 47 48 const string curfilename = "curfilelist.xml"; 49 const string newfilename = "filelist.xml"; 50 InvokeStatus(string.Format("正在请求{0}", newfilename)); 51 string filename = newfilename; 52 string postdata = 53 string.Format(""CustomerCode":"{0}","Token":"{1}","Mac":"{2}","Filename":"{3}"", 54 customerCode, token, mac, filename); 55 var makeRequest = client.MakeRequest("", postdata); 56 57 #endregion 58 59 if (makeRequest.Length > 0) 60 { 61 InvokeStatus(string.Format("正在保存{0}", newfilename)); 62 63 #region 正在保存filelist.xml 64 65 filename = Path.Combine(path, filename); 66 var directoryName = Path.GetDirectoryName(filename); 67 if (!Directory.Exists(directoryName)) 68 { 69 Directory.CreateDirectory(directoryName); 70 } 71 using (var file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 72 { 73 file.Write(makeRequest, 0, makeRequest.Length); 74 } 75 76 #endregion 77 78 #region 判断是否需要更新 79 80 var curfileListEntity = new FileListEntity(); 81 var fileListEntity = filename.DeserializeConfig<FileListEntity>(); 82 83 if (File.Exists(Path.Combine(path, curfilename))) 84 { 85 curfileListEntity = Path.Combine(path, curfilename).DeserializeConfig<FileListEntity>(); 86 if (fileListEntity.FileCode == curfileListEntity.FileCode) 87 { 88 File.Delete(Path.Combine(path, newfilename)); 89 InvokeStatus("不需要更新"); 90 return; 91 } 92 } 93 94 #endregion 95 96 #region 更新文件列表 97 98 foreach (var fileEntity in fileListEntity.FileEntities) 99 { 100 var find = curfileListEntity.FileEntities.Find(entity => entity.FileName == fileEntity.FileName); 101 102 if (find != null && fileEntity.LastUpdate == find.LastUpdate) 103 { 104 continue; 105 } 106 filename = fileEntity.FileName; 107 InvokeStatus("正在更新" + filename); 108 postdata = string.Format(""CustomerCode":"{0}","Token":"{1}","Mac":"{2}","Filename":"{3}"", customerCode, token, mac, filename); 109 makeRequest = client.MakeRequest("", postdata); 110 if (makeRequest.Length > 0) 111 { 112 InvokeStatus("正在保存" + filename); 113 filename = Path.Combine(path, filename); 114 directoryName = Path.GetDirectoryName(filename); 115 if (!Directory.Exists(directoryName)) 116 { 117 Directory.CreateDirectory(directoryName); 118 } 119 using (var file = new FileStream(filename, FileMode.Create, FileAccess.ReadWrite)) 120 { 121 file.Write(makeRequest, 0, makeRequest.Length); 122 } 123 } 124 } 125 126 #endregion 127 128 File.Delete(Path.Combine(path, curfilename)); 129 File.Move(Path.Combine(path, newfilename), Path.Combine(path, curfilename)); 130 InvokeStatus("update ok"); 131 } 132 else 133 { 134 InvokeStatus("请求更新失败,请确认配置信息"); 135 } 136 } 137 } 138 139 public class FileEntity 140 { 141 public string LastUpdate { get; set; } 142 public string FileName { get; set; } 143 } 144 145 public class FileListEntity 146 { 147 private List<FileEntity> _fileEntities = new List<FileEntity>(); 148 public string FileCode { get; set; } 149 150 public List<FileEntity> FileEntities 151 { 152 get { return _fileEntities; } 153 set { _fileEntities = value; } 154 } 155 } 156 }
StatusProcess
1 /* Jonney Create 2015-3-22 */ 2 using System.Diagnostics; 3 using System.Windows.Forms; 4 5 namespace Downloader 6 { 7 public delegate void DownloadStatusHandler(string status); 8 9 public class StatusProcess 10 { 11 /// <summary> 12 /// 下载状态事件,状态改变都会触发 13 /// </summary> 14 public event DownloadStatusHandler DownloadStatus; 15 16 protected readonly Stopwatch Stopwatch; 17 18 public StatusProcess() 19 { 20 Stopwatch = new Stopwatch(); 21 } 22 23 /// <summary> 24 /// 如果DownloadStatus事件被注册,都会被执行 25 /// </summary> 26 /// <param name="status"></param> 27 protected void InvokeStatus(string status) 28 { 29 if (DownloadStatus != null) 30 { 31 DownloadStatus.Invoke(status); 32 Application.DoEvents(); 33 } 34 } 35 } 36 37 38 }
Downloader
1 private void btnUpdater_Click(object sender, EventArgs e) 2 { 3 var thread = new Thread(DownloadFilelist) {IsBackground = true}; 4 thread.Start(); 5 } 6 7 private void DownloadFilelist() 8 { 9 try 10 { 11 SetEnable(false); 12 const string cfg = "CustomerInfo.xml"; 13 var generator = new Generator(); 14 generator.DownloadStatus += generator_DownloadStatus; 15 16 string file = Path.Combine(Application.StartupPath, cfg); 17 if (!File.Exists(file)) 18 { 19 generator_DownloadStatus(string.Format("配置信息{0}损坏", cfg)); 20 return; 21 } 22 var customerInfo = file.DeserializeConfig<CustomerInfo>(); 23 if (customerInfo == null) 24 { 25 generator_DownloadStatus(string.Format("配置信息{0}损坏", cfg)); 26 return; 27 } 28 29 var mac = GetMacString(); 30 customerInfo.Mac = mac[0]; 31 generator.DownloadFileList(Application.StartupPath 32 , customerInfo.ServerUrl 33 , customerInfo.CustomerCode 34 , customerInfo.Token 35 , customerInfo.Mac); 36 37 this.Invoke(new Action(Boot)); 38 } 39 catch (Exception err) 40 { 41 generator_DownloadStatus(string.Format("{0}", err.Message)); 42 } 43 finally 44 { 45 /*SetEnable(true);*/ 46 } 47 } 48 49 private void SetEnable(bool isEnable) 50 { 51 this.Invoke(new Action(() => 52 { 53 btnClose.Enabled = isEnable; 54 btnUpdater.Enabled = isEnable; 55 })); 56 } 57 58 private void generator_DownloadStatus(string status) 59 { 60 this.Invoke(new Action(() => 61 { 62 label1.Text = status; 63 Application.DoEvents(); 64 })); 65 } 66 67 public string[] GetMacString() 68 { 69 string strMac = ""; 70 NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); 71 foreach (NetworkInterface ni in interfaces) 72 { 73 if (ni.OperationalStatus == OperationalStatus.Up) 74 { 75 strMac += ni.GetPhysicalAddress() + "|"; 76 } 77 } 78 return strMac.Split('|'); 79 80 }