【问题标题】:Retrieving application settings after a name change?更改名称后检索应用程序设置?
【发布时间】:2009-01-07 12:18:18
【问题描述】:

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

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

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

我想读取每个用户的设置,这些设置隐藏在 LocalSettings 文件夹中的模糊位置,所以我不知道将什么传递给这些方法。

【问题讨论】:

    标签: .net winforms configuration


    【解决方案1】:

    为了完整性.. 我结束了这个黑客。丑陋,但它有效。

    在主方法中
    // 如果我们没有设置,只做升级检查 if (string.IsNullOrEmpty(Properties.Settings.Default.Categories)) { 升级应用程序设置(); }

    在同一个类中使用这些方法。

      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);
         }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-21
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多