Восстановление настроек приложения после смены имени? - PullRequest
0 голосов
/ 07 января 2009

У меня есть приложение Windows Forms, которое содержит настройки для каждого пользователя. Я использую Properties.Settings.Default.Upgrade (), чтобы сохранить эти настройки между версиями, и все в порядке. Недавно мне пришлось изменить exe-имя моего приложения, поэтому после обновления все настройки возвращаются к значениям по умолчанию.

Я думаю, система настроек считает, что это другое приложение, поэтому мой вопрос, есть ли способ восстановить настройки другого приложения (старого)?

System.ConfigurationManager имеет несколько методов для открытия файлов конфигурации, отличных от текущего приложения (i.e.System.Configuration.ConfigurationManager.OpenMappedExeConfiguration), но все они, похоже, открывают определенные файлы конфигурации.

Я хочу прочитать настройки для каждого пользователя, и они скрыты в неясных местах в папке LocalSettings, поэтому я не знаю, что передать этим методам.

1 Ответ

0 голосов
/ 05 ноября 2009

Для полноты .. Я закончил с этим взломом. Ужасно, но это работает.

В основном методе
// Проверяем обновление только если у нас нет настроек if (string.IsNullOrEmpty (Properties.Settings.Default.Categories)) { UpgradeAppSettings (); }

С этими методами в одном классе.

  private static void UpgradeAppSettings()
  {
     try // Fail silently! This hack is not important enough to cause problems
     {
        List<string> paths = new List<string>();
        paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData));
        paths.Add(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));

        foreach (string path in paths)
        {
           string companypath = System.IO.Directory.GetDirectories(path, "COMPANYNAME").FirstOrDefault();
           if (companypath != null)
           {
              string appfolder = System.IO.Directory.GetDirectories(companypath, "OldName.exe_*").FirstOrDefault();

              if (appfolder != null)
              {
                 // Get the highest version of the app that contains a user.config file
                 var version =
                    System.IO.Directory.GetDirectories(appfolder)
                    .Select(
                       d => new
                       {
                          Path = d,
                          Version = CreateVersion(new System.IO.DirectoryInfo(d).Name),
                          ConfigFile = System.IO.Directory.GetFiles(d, "user.config").FirstOrDefault()
                       }
                    )
                    .Where(v => v.Version != null && v.ConfigFile != null)
                    .OrderByDescending(v => v.Version)
                    .FirstOrDefault();
                 if (version != null)
                 {
                    string text = System.IO.File.ReadAllText(version.ConfigFile);

                    // Change the namespace for serialized categories
                    text = text.Replace(
                       "http://schemas.microsoft.com/clr/nsassem/OldName/OldName",
                       "http://schemas.microsoft.com/clr/nsassem/OldName/NewName");

                    var doc = XDocument.Parse(text);
                    var settings = doc.Descendants("setting");

                    // These are the settings we are interested in
                    ApplySetting(settings, "Categories", s => Properties.Settings.Default.Categories = s);
                    ApplySetting(settings, "ActiveCategoryFilter", s => Properties.Settings.Default.ActiveCategoryFilter = s);
                    ApplySetting(settings, "ActiveCategoryFilterDisplayName", s => Properties.Settings.Default.ActiveCategoryFilterDisplayName = s);
                    ApplySetting(settings, "ListViewLayout", s => Properties.Settings.Default.ListViewLayout = s);
                    ApplySetting(settings, "SplitterSizes", s => Properties.Settings.Default.SplitterSizes = s);
                    ApplySetting(settings, "EditorSizes", s => Properties.Settings.Default.EditorSizes = s);
                    ApplySetting(settings, "WindowStates", s => Properties.Settings.Default.WindowStates = s);
                    ApplySetting(settings, "WindowStates", s => Properties.Settings.Default.WindowStates = s);
                    break;
                 }
              }
           }
        }
     }
     catch { }
  }

  private static void ApplySetting(IEnumerable<XElement> settings, string name, Action<string> action)
  {
     var cat = settings.FirstOrDefault(s => s.Attribute("name") != null && s.Attribute("name").Value == name);
     if (cat != null)
     {
        action(cat.Value);
     }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...