Program.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Security.Cryptography;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace PatchUploader
  11. {
  12. class Program
  13. {
  14. private static void updateVersion(string file)
  15. {
  16. if (File.Exists(file))
  17. {
  18. string text = File.ReadAllText(file);
  19. int version = Int32.Parse(text);
  20. version++;
  21. text = text.Replace(text, version.ToString());
  22. File.WriteAllText(file, text);
  23. }
  24. }
  25. private static void createFtpDirectory(string dir)
  26. {
  27. try
  28. {
  29. var request = (FtpWebRequest)WebRequest.Create(ftp + dir);
  30. request.Method = WebRequestMethods.Ftp.MakeDirectory;
  31. request.Credentials = new NetworkCredential(user, pass);
  32. request.UsePassive = true;
  33. request.UseBinary = true;
  34. request.KeepAlive = false;
  35. request.EnableSsl = true;
  36. using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
  37. {
  38. if (response.StatusCode != FtpStatusCode.PathnameCreated)
  39. {
  40. WriteConsoleLine(ConsoleColor.Green, "Dir created: " + dir);
  41. }
  42. response.Close();
  43. }
  44. }
  45. catch (Exception ex)
  46. {
  47. //Console.WriteLine("createFtpDirectory -> " + ex.Message);
  48. }
  49. }
  50. private static void uploadFileToFtp(string file)
  51. {
  52. try
  53. {
  54. var request = (FtpWebRequest)WebRequest.Create(ftp + file);
  55. request.Method = WebRequestMethods.Ftp.UploadFile;
  56. request.Credentials = new NetworkCredential(user, pass);
  57. request.UsePassive = true;
  58. request.UseBinary = true;
  59. request.KeepAlive = false;
  60. request.EnableSsl = true;
  61. using (var fileStream = File.OpenRead(file))
  62. {
  63. using (var requestStream = request.GetRequestStream())
  64. {
  65. fileStream.CopyTo(requestStream);
  66. requestStream.Close();
  67. }
  68. fileStream.Close();
  69. }
  70. var response = (FtpWebResponse)request.GetResponse();
  71. WriteConsoleLine(ConsoleColor.Green, "Uploaded: " + file);
  72. response.Close();
  73. }
  74. catch (Exception ex)
  75. {
  76. Console.WriteLine("uploadFileToFtp -> " + ex.Message);
  77. }
  78. }
  79. private static void deleteFileFromFtp(string path)
  80. {
  81. try
  82. {
  83. FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + path);
  84. request.Method = WebRequestMethods.Ftp.DownloadFile;
  85. request.Credentials = new NetworkCredential(user, pass);
  86. request.UsePassive = true;
  87. request.UseBinary = true;
  88. request.KeepAlive = false;
  89. request.EnableSsl = true;
  90. request.Method = WebRequestMethods.Ftp.DeleteFile;
  91. FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  92. WriteConsoleLine(ConsoleColor.Red, "Deleted: " + path);
  93. response.Close();
  94. } catch (Exception ex)
  95. {
  96. Console.WriteLine("deleteFileFromFtp -> " + ex.Message);
  97. }
  98. }
  99. private static void downloadFileFromFtp(string dir, string file)
  100. {
  101. try
  102. {
  103. FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftp + dir + "/" + file);
  104. request.Method = WebRequestMethods.Ftp.DownloadFile;
  105. request.Credentials = new NetworkCredential(user, pass);
  106. request.UsePassive = true;
  107. request.UseBinary = true;
  108. request.KeepAlive = false;
  109. request.EnableSsl = true;
  110. FtpWebResponse response = (FtpWebResponse)request.GetResponse();
  111. Stream responseStream = response.GetResponseStream();
  112. StreamReader reader = new StreamReader(responseStream);
  113. using (StreamReader sr = new StreamReader(responseStream))
  114. {
  115. string line;
  116. while ((line = sr.ReadLine()) != null)
  117. {
  118. File.AppendAllText("srv_" + file, line + Environment.NewLine);
  119. }
  120. }
  121. WriteConsoleLine(ConsoleColor.Green, "Download Complete: " + file);
  122. reader.Close();
  123. response.Close();
  124. } catch (Exception ex)
  125. {
  126. // ...
  127. }
  128. }
  129. private static void uploadDirectoryToFtp(string dir)
  130. {
  131. try
  132. {
  133. DirectoryInfo folderToUpload = new DirectoryInfo(dir);
  134. createFtpDirectory(dir);
  135. foreach (FileInfo file in folderToUpload.GetFiles())
  136. {
  137. if (uploadList.Contains(file.Name))
  138. {
  139. uploadFileToFtp(dir + "/" + file.Name);
  140. }
  141. }
  142. foreach (DirectoryInfo dirInfo in folderToUpload.GetDirectories())
  143. {
  144. uploadDirectoryToFtp(dir + "/" + dirInfo.Name);
  145. }
  146. }
  147. catch (Exception ex)
  148. {
  149. Console.WriteLine("uploadDirectoryToFtp -> " + ex.Message);
  150. }
  151. }
  152. private static string getMD5HashFromFile(string fileName)
  153. {
  154. FileStream file = new FileStream(fileName, FileMode.Open);
  155. MD5 md5 = new MD5CryptoServiceProvider();
  156. byte[] retVal = md5.ComputeHash(file);
  157. file.Close();
  158. StringBuilder sb = new StringBuilder();
  159. for (int i = 0; i < retVal.Length; i++)
  160. {
  161. sb.Append(retVal[i].ToString("x2"));
  162. }
  163. return sb.ToString();
  164. }
  165. private static void deleteFile(string file)
  166. {
  167. if (File.Exists(file))
  168. {
  169. File.Delete(file);
  170. }
  171. }
  172. private static void compareMD5ofFiles(string dir)
  173. {
  174. string filecontent = getFileContent(srv_md5file);
  175. if (Directory.Exists(dir))
  176. {
  177. DirectoryInfo folderToRead = new DirectoryInfo(dir);
  178. foreach (FileInfo f in folderToRead.GetFiles())
  179. {
  180. if (!filecontent.Contains(getMD5HashFromFile(f.FullName)))
  181. {
  182. uploadList.Add(f.Name);
  183. Console.WriteLine("Added to uploadlist: " + f.Name);
  184. }
  185. }
  186. foreach (DirectoryInfo dirInfo in folderToRead.GetDirectories())
  187. {
  188. compareMD5ofFiles(dir + "/" + dirInfo.Name);
  189. }
  190. }
  191. }
  192. private static void createMD5TableFile(string file, string dir)
  193. {
  194. if (Directory.Exists(dir))
  195. {
  196. DirectoryInfo folderToRead = new DirectoryInfo(dir);
  197. foreach (FileInfo f in folderToRead.GetFiles())
  198. {
  199. File.AppendAllText(file, dir + "/" + f.Name + "=" + getMD5HashFromFile(f.FullName) + Environment.NewLine);
  200. }
  201. foreach (DirectoryInfo dirInfo in folderToRead.GetDirectories())
  202. {
  203. createMD5TableFile(file, dir + "/" + dirInfo.Name);
  204. }
  205. }
  206. }
  207. private static void checkFilesToDelete()
  208. {
  209. String local_md5 = getFileContent(md5file);
  210. String srv_md5 = getFileContent(srv_md5file);
  211. String[] s_md5 = srv_md5.Split('\n');
  212. foreach (string line in s_md5)
  213. {
  214. if (!local_md5.Contains(line.Split('=')[0]))
  215. {
  216. deleteList.Add(line.Split('=')[0]);
  217. WriteConsoleLine(ConsoleColor.Green, "Added to deleteList: " + line.Split('=')[0]);
  218. }
  219. }
  220. }
  221. private static void deleteFilesFromFtp()
  222. {
  223. for (int i = 0; i < deleteList.Count; i++)
  224. {
  225. deleteFileFromFtp(deleteList[i].ToString());
  226. }
  227. }
  228. private static string getFileContent(string file)
  229. {
  230. string filecontent = "";
  231. if (File.Exists(file))
  232. {
  233. StreamReader f = new StreamReader(file);
  234. string line = "";
  235. while ((line = f.ReadLine()) != null)
  236. {
  237. filecontent += line + "\n";
  238. }
  239. f.Close();
  240. }
  241. return filecontent;
  242. }
  243. private static void WriteConsoleLine(ConsoleColor c, String text)
  244. {
  245. Console.ForegroundColor = c;
  246. Console.WriteLine(text);
  247. Console.ResetColor();
  248. }
  249. // FTP Credentials
  250. static string ftp = "ftp://domain/path/to/files/";
  251. static string user = "";
  252. static string pass = "";
  253. // Directory to sync
  254. static string directory = "files";
  255. // FileNames
  256. static string versionfile = "version.txt";
  257. static string md5file = "md5table.txt";
  258. static string srv_md5file = "srv_" + md5file;
  259. static ArrayList uploadList = new ArrayList();
  260. static ArrayList deleteList = new ArrayList();
  261. static void Main(string[] args)
  262. {
  263. if (args.Count() > 0)
  264. {
  265. directory = args[0];
  266. }
  267. Console.WriteLine("Start synchronizing directory '" + directory + "' ...");
  268. Console.WriteLine("Updating '" + versionfile + "'...");
  269. updateVersion(directory + "/" + versionfile);
  270. Console.WriteLine("Creating local MD5 Table...");
  271. createMD5TableFile(md5file, directory);
  272. Console.WriteLine("Downloading MD5 Table from server...");
  273. downloadFileFromFtp("", md5file);
  274. Console.WriteLine("Comparing local MD5 Table with the one from server...");
  275. compareMD5ofFiles(directory);
  276. Console.WriteLine("Start uploading changed and missing files...");
  277. uploadDirectoryToFtp(directory);
  278. Console.WriteLine("Check what to delete from server...");
  279. checkFilesToDelete();
  280. deleteFilesFromFtp();
  281. Console.WriteLine("Replacing current '" + md5file + "' with the one from server...");
  282. uploadFileToFtp(md5file);
  283. Console.WriteLine("Cleaning up md5files...");
  284. deleteFile(srv_md5file);
  285. deleteFile(md5file);
  286. Console.WriteLine("Finished synchronizing directory '" + directory + "' !");
  287. Console.ReadKey();
  288. }
  289. }
  290. }