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

Posted

技术标签:

【中文标题】当版本号更改时,如何升级 user.config 中的所有设置?【英文标题】:How do you upgrade all settings in user.config when the version number changes? 【发布时间】:2013-01-28 11:00:07 【问题描述】:

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

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

我已经阅读了许多问题和答案(比如这个 - How do you keep user.config settings across different assembly versions in .net?),它们都建议在一些版本号检查中包装一个 ApplicationSettingsBase.Upgrade() 调用。

问题是(据我所知)您需要知道每个 *SettingsKey( 用于实例化所有 ApplicationSettingsBase 对象以依次调用升级方法的值。

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

【问题讨论】:

它只是一个 XML 文件,对吧? 是的,Jeremy,它是 Xml,这就是我今天早上开始的轨道。它是一个 Xml 文件,但是,对于应用程序的每个新版本,都会在用户配置文件的新文件夹中创建一个新的 Xml 文件。目前,我正在查找旧的 Xml 文件并努力读取 userSettings 节点,以便实例化所有相关的设置对象。虽然感觉“hacky”,但我想知道是否有更好的方法。 (当我问这个问题时,我还没有开始走这条路)。如果没有更好的建议,我会发布结果。 我认为这是***.com/questions/534261/… 的副本(它的答案比这里接受的答案要好得多)。 该问题的答案(在问题 btw 中链接)和其他类似的问题似乎不适用于存储在 user.config 文件中的自定义应用程序设置,通过继承自 ApplicationSettingsBase 的类。有没有办法使用这种方法升级所有这些设置。我同意它更干净,但目前这里存储了数百个设置。 见http://***.com/questions/534261 【参考方案1】:

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

如果有新版本正在运行,我会复制之前版本的 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 对这个问题 (How do you upgrade Settings.settings when the stored data type changes?) 的回答,因为中间的 Linq 获得了 PreviousSettingsDir。

【讨论】:

以上是关于当版本号更改时,如何升级 user.config 中的所有设置?的主要内容,如果未能解决你的问题,请参考以下文章

当应用程序在苹果商店或 testFlight 上发布时,plist 中的框架版本号由 XCode 13 更改

我可以控制 .NET 用户设置的位置以避免在应用程序升级时丢失设置吗?

如何对Android的版本进行检测与更新

如何修改Maven的JDK版本

Node版本如何升级

02_dubbo实例_多版本号