OSDN Git Service

Roamingに設定ファイルを置く場合の古い設定の扱いを変更
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Mar 2017 04:16:57 +0000 (13:16 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 18 Mar 2017 04:27:53 +0000 (13:27 +0900)
Roaming に設定ファイルをコピーした後、再び管理者権限で実行された場合などで
StartupPath の設定ファイルの方がより新しくなっていた場合は再度コピーを行う

OpenTween/ApplicationEvents.cs

index 82fc983..c52ba5e 100644 (file)
@@ -244,23 +244,50 @@ namespace OpenTween
                     // 書き込みに失敗した場合 (Program Files 以下に配置されている場合など)
 
                     // 通常は C:\Users\ユーザー名\AppData\Roaming\OpenTween\ となる
-                    MyCommon.settingPath = Path.Combine(new[]
+                    var roamingDir = Path.Combine(new[]
                     {
                         Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                         Application.ProductName,
                     });
-                    Directory.CreateDirectory(MyCommon.settingPath);
-
-                    if (File.Exists(Path.Combine(MyCommon.settingPath, "SettingCommon.xml")))
+                    Directory.CreateDirectory(roamingDir);
+
+                    MyCommon.settingPath = roamingDir;
+
+                    /*
+                     * 書き込みが制限されたディレクトリ内で起動された場合の設定ファイルの扱い
+                     *
+                     *  (A) StartupPath に存在する設定ファイル
+                     *  (B) Roaming に存在する設定ファイル
+                     *
+                     *  1. A も B も存在しない場合
+                     *    => B を新規に作成する
+                     *
+                     *  2. A が存在し、B が存在しない場合
+                     *    => A の内容を B にコピーする (警告を表示)
+                     *
+                     *  3. A が存在せず、B が存在する場合
+                     *    => B を使用する
+                     *
+                     *  4. A も B も存在するが、A の方が更新日時が新しい場合
+                     *    => A の内容を B にコピーする (警告を表示)
+                     *
+                     *  5. A も B も存在するが、B の方が更新日時が新しい場合
+                     *    => B を使用する
+                     */
+                    var startupDirFile = new FileInfo(Path.Combine(Application.StartupPath, "SettingCommon.xml"));
+                    var roamingDirFile = new FileInfo(Path.Combine(roamingDir, "SettingCommon.xml"));
+
+                    if (roamingDirFile.Exists && (!startupDirFile.Exists || startupDirFile.LastWriteTime <= roamingDirFile.LastWriteTime))
                     {
-                        // 既に Roaming に設定ファイルが存在する場合
+                        // 既に Roaming に設定ファイルが存在し、Roaming 内のファイルの方が新しい場合は
+                        // StartupPath に設定ファイルが存在しても無視する
                         SettingManager.LoadAll();
                     }
                     else
                     {
-                        if (File.Exists(Path.Combine(Application.StartupPath, "SettingCommon.xml")))
+                        if (startupDirFile.Exists)
                         {
-                            // StartupPath に設定ファイルが存在し、かつ書き込みができない場合のみ警告を表示する
+                            // StartupPath に設定ファイルが存在し、Roaming 内のファイルよりも新しい場合のみ警告を表示する
                             var message = string.Format(Properties.Resources.SettingPath_Relocation, Application.StartupPath, MyCommon.settingPath);
                             MessageBox.Show(message, Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information);
                         }