当版本号更改时,如何升级user.config中的所有设置

本文关键字:config 设置 user 何升级 版本号 | 更新日期: 2023-09-27 17:58:48

我有许多用户范围的设置由从ApplicationSettingsBase继承的对象存储在user.config中。

每个实例的SettingsKey在运行时主要使用表单名称动态派生。因此可能有数百个。

我读过很多问题和答案(比如这个-如何在.net中的不同程序集版本中保留user.config设置?),这些问题和答案都建议在某些版本号检查中包装ApplicationSettingsBase.Upgrade()调用。

问题是(据我所知)你需要知道每一个*SettingsKey(用于实例化所有ApplicationSettingsBase对象的值),然后调用升级方法。

有没有一种方法可以一次升级所有user.config设置,或者迭代文件中的所有设置来升级它们

当版本号更改时,如何升级user.config中的所有设置

我觉得我想出的方法有点像黑客,但太多的方法都失败了,我需要继续做下去:-(

在运行新版本时,我采用了复制以前版本的user.config的方法。

首先,确定是否需要升级,就像这个问题的许多变体所建议的那样。

System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
Version version = assembly.GetName().Version;
if (version.ToString() != Properties.Settings.Default.ApplicationVersion)
{
    copyLastUserConfig(version);
}

然后,复制最后一个user.config…

private static void copyLastUserConfig(Version currentVersion)
{
try
{
    string userConfigFileName = "user.config";

    // Expected location of the current user config
    DirectoryInfo currentVersionConfigFileDir = new FileInfo(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal).FilePath).Directory;
    if (currentVersionConfigFileDir == null)
    {
        return;
    }
    // Location of the previous user config
    // grab the most recent folder from the list of user's settings folders, prior to the current version
    var previousSettingsDir = (from dir in currentVersionConfigFileDir.Parent.GetDirectories()
                               let dirVer = new { Dir = dir, Ver = new Version(dir.Name) }
                               where dirVer.Ver < currentVersion
                               orderby dirVer.Ver descending
                               select dir).FirstOrDefault();
    if (previousSettingsDir == null)
    {
        // none found, nothing to do - first time app has run, let it build a new one
        return;
    }
    string previousVersionConfigFile = string.Concat(previousSettingsDir.FullName, @"'", userConfigFileName);
    string currentVersionConfigFile = string.Concat(currentVersionConfigFileDir.FullName, @"'", userConfigFileName);
    if (!currentVersionConfigFileDir.Exists)
    {
        Directory.CreateDirectory(currentVersionConfigFileDir.FullName);
    }
    File.Copy(previousVersionConfigFile, currentVersionConfigFile, true);
}
catch (Exception ex)
{
    HandleError("An error occurred while trying to upgrade your user specific settings for the new version. The program will continue to run, however user preferences such as screen sizes, locations etc will need to be reset.", ex);
}
}

感谢Allon Guralnek为中间的Linq回答了这个问题(当存储的数据类型发生变化时,如何升级Settings.Settings?),该Linq获得PreviousSettingsDir。