OSDN Git Service

AppliStation-GUI,自己インストールのテスト実装 v1.1.0
authorttp <ttp@users.sourceforge.jp>
Sat, 29 Nov 2008 10:31:09 +0000 (10:31 +0000)
committerttp <ttp@users.sourceforge.jp>
Sat, 29 Nov 2008 10:31:09 +0000 (10:31 +0000)
とりあえず動いている。これからは、AppliStationをAppliStationで更新した後に起動すれば勝手に書き換えられる。

更新時にスプラッシュが表示されないとか、あやしいのでデバッグMessageBox.Show付き

git-svn-id: http://localhost/svn/AppliStation/trunk@994 34ed2c89-c49f-4a4b-abdb-c318350108cf

AppliStation/Program.cs

index 381deae..9427ff1 100644 (file)
@@ -72,6 +72,56 @@ namespace AppliStation
                        }\r
                }\r
                \r
                        }\r
                }\r
                \r
+               void RunUpdateAppliStation()\r
+               {\r
+                       System.Threading.Thread.Sleep(5000); /* 5sec待って呼び出しもとの終了を待つ */\r
+                       \r
+                       string newAppliStationDir = Application.StartupPath;\r
+                       string targetDir = Environment.CurrentDirectory;\r
+                       foreach (string file in Directory.GetFiles(newAppliStationDir)) {\r
+                               string ext = Path.GetExtension(file).ToLower();\r
+                               if ((ext == ".exe") || (ext == ".dll") ||\r
+                                   (ext == ".pdb") || (ext == ".png")) {\r
+                                       File.Copy(file, Path.Combine(targetDir, Path.GetFileName(file)), true);\r
+                               }\r
+                       }\r
+MessageBox.Show("Installation is completed.");\r
+                       System.Threading.Thread.Sleep(10);\r
+                       System.Diagnostics.Process.Start(Path.Combine(targetDir, Path.GetFileName(Application.ExecutablePath)));\r
+                       hideSplashScreen();\r
+                       //Application.Exit(); // Do nothing = exit\r
+               }\r
+               \r
+               /// <summary>\r
+               /// AppliStationの自己更新を行う。アーカイブインストーラによってあらかじめインストールされたファイルを、\r
+               /// カレントディレクトリにコピーするよう新しいAppliStation.exeを呼ぶ。\r
+               /// コピー元がないまたはそれが新しくないならば何もしない。\r
+               /// </summary>\r
+               /// <returns>更新をしたときtrueをかえす。</returns>\r
+               private bool autoUpdateAppliStation()\r
+               {\r
+                       if (string.IsNullOrEmpty(appArgs["cmd"].ToString())) {\r
+                               string newAppliStationDir = Path.Combine(NaGet.Env.ArchiveProgramFiles, "AppliStation");\r
+                               string thisAppliStation = Application.ExecutablePath;\r
+                               \r
+                               if (Directory.Exists(newAppliStationDir)) {\r
+                                       string newAppliStation = Path.Combine(newAppliStationDir, Path.GetFileName(thisAppliStation));\r
+                                       \r
+MessageBox.Show(string.Format("{0}\r\n{1}", newAppliStation, File.Exists(newAppliStation)));\r
+MessageBox.Show(string.Format("{0}\r\n{1}", File.GetLastWriteTime(thisAppliStation), File.GetLastWriteTime(newAppliStation)));\r
+MessageBox.Show(string.Format("{0}", File.GetLastWriteTime(thisAppliStation) < File.GetLastWriteTime(newAppliStation)));\r
+                                       \r
+                                       if ( File.Exists(newAppliStation) &&\r
+                                           (File.GetLastWriteTime(thisAppliStation) < File.GetLastWriteTime(newAppliStation)) ) {\r
+\r
+                                               System.Diagnostics.Process.Start(newAppliStation, "--cmd=updateAppliStation");\r
+                                               return true;\r
+                                       }\r
+                               }\r
+                       }\r
+                       return false;\r
+               }\r
+               \r
                private void hideSplashScreen()\r
                {\r
                        if (splashScreen != null && splashScreen.Visible) {\r
                private void hideSplashScreen()\r
                {\r
                        if (splashScreen != null && splashScreen.Visible) {\r
@@ -89,6 +139,16 @@ namespace AppliStation
                                return;\r
                        }\r
                        \r
                                return;\r
                        }\r
                        \r
+                       // cmd引数がないときに更新処理を試みる。\r
+                       // cmd引数があるときに更新しないのは、AppliStationから「管理者で実行」などで呼び出された場合に\r
+                       // 更新処理にならないようにするため。\r
+                       if ( string.IsNullOrEmpty((string) appArgs["cmd"]) &&\r
+                           autoUpdateAppliStation() ) {\r
+                               // アップデートしたときは起動しない\r
+                               return;\r
+                       }\r
+                       \r
+                       \r
                        switch ((string) appArgs["cmd"]) {\r
                                case "install":\r
                                        RunInstall();\r
                        switch ((string) appArgs["cmd"]) {\r
                                case "install":\r
                                        RunInstall();\r
@@ -96,6 +156,9 @@ namespace AppliStation
                                case "uninstall":\r
                                        RunUninstall();\r
                                        break;\r
                                case "uninstall":\r
                                        RunUninstall();\r
                                        break;\r
+                               case "updateAppliStation":\r
+                                       RunUpdateAppliStation();\r
+                                       break;\r
                                default:\r
                                        RunNormal();\r
                                        break;\r
                                default:\r
                                        RunNormal();\r
                                        break;\r