更改名称后检索应用程序设置?

时间:2009-01-07 12:18:18

标签: .net winforms configuration

我有一个包含每个用户设置的Windows窗体应用程序。 我正在使用Properties.Settings.Default.Upgrade()来保留版本之间的这些设置,一切都很好。 最近我不得不更改我的应用程序的exe名称,因此升级后,所有设置都会恢复为默认值。

我猜设置系统认为它是一个不同的应用程序,所以我的问题是, 有没有办法检索另一个应用程序(旧的)的设置?

System.ConfigurationManager有一些方法可以打开除当前应用程序之外的配置文件(即.ystem.Configuration.ConfigurationManager.OpenMappedExeConfiguration),但它们似乎都打开了特定的配置文件。

我想阅读每个用户的设置,这些设置都隐藏在LocalSettings文件夹中的模糊位置,所以我不知道要传递给这些方法的内容。

1 个答案:

答案 0 :(得分:0)

为了完整.. 我最终得到了这个黑客。丑陋,但它确实有效。

在主要方法中       //如果我们没有设置,只进行升级检查       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);
     }
  }