using System; using System.Collections.Generic; using System.Windows.Forms; using System.IO; namespace Updater { static class Program { static bool MAC = false; /// /// The main entry point for the application. /// [STAThread] static void Main() { OperatingSystem os = Environment.OSVersion; Console.WriteLine(os.VersionString.ToString()); if (os.VersionString.ToString().ToUpper().Contains("UNIX")) { MAC = true; } string path = Path.GetDirectoryName(Application.ExecutablePath); // give 4 seconds grace System.Threading.Thread.Sleep(5000); //UpdateFiles(path); if (!UpdateFiles(path)) { Console.WriteLine("Update failed, please try it later."); Console.WriteLine("Press any key to continue."); Console.ReadKey(); } else { try { System.Diagnostics.Process P = new System.Diagnostics.Process(); if (MAC) { P.StartInfo.FileName = "mono"; P.StartInfo.Arguments = " \"" + Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "ArdupilotMegaPlanner10.exe\""; } else { P.StartInfo.FileName = Path.GetDirectoryName(Application.ExecutablePath) + Path.DirectorySeparatorChar + "ArdupilotMegaPlanner10.exe"; P.StartInfo.Arguments = ""; } Console.WriteLine("Start " + P.StartInfo.FileName + " with " + P.StartInfo.Arguments); P.Start(); } catch { } // likely file didnt exist } } static bool UpdateFiles(string directory) { bool all_done = true; try { string[] files = Directory.GetFiles(directory); Console.WriteLine("dir: "+directory); foreach (string file in files) { if (file.ToLower().EndsWith(".new") && file.ToLower() != ".new") // cant move ".new" to "" { Console.WriteLine("\t file: " + file); bool done = false; for (int try_count = 0; try_count < 10 && !done; try_count++) // try no more than 5 times { if (file.ToLower().Contains("updater.exe")) { // cant self update on windows done = true; break; } try { Console.Write("Move: " + file + " TO " + file.Remove(file.Length - 4)); File.Copy(file, file.Remove(file.Length - 4), true); done = true; File.Delete(file); Console.WriteLine(" Done."); } catch { Console.WriteLine(file + " Failed."); System.Threading.Thread.Sleep(500); } } all_done = all_done && done; } } } catch { } foreach (string subdir in Directory.GetDirectories(directory)) all_done = all_done && UpdateFiles(subdir); return all_done; //P.StartInfo.RedirectStandardOutput = true; } } }