我有一个包含每个用户设置的Windows窗体应用程序。 我正在使用Properties.Settings.Default.Upgrade()来保留版本之间的这些设置,一切都很好。 最近我不得不更改我的应用程序的exe名称,因此升级后,所有设置都会恢复为默认值。
我猜设置系统认为它是一个不同的应用程序,所以我的问题是, 有没有办法检索另一个应用程序(旧的)的设置?
System.ConfigurationManager有一些方法可以打开除当前应用程序之外的配置文件(即.ystem.Configuration.ConfigurationManager.OpenMappedExeConfiguration),但它们似乎都打开了特定的配置文件。
我想阅读每个用户的设置,这些设置都隐藏在LocalSettings文件夹中的模糊位置,所以我不知道要传递给这些方法的内容。
答案 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);
}
}