如何在文件版本更改中保留 .settings/.config 文件中的更改?

Posted

技术标签:

【中文标题】如何在文件版本更改中保留 .settings/.config 文件中的更改?【英文标题】:How to persist changes in a .settings/.config file across a file version change? 【发布时间】:2011-01-29 11:20:45 【问题描述】:

我创建了一个应用程序,它使用 settings.settings 来存储一些用户特定的设置(范围=用户)。设置在启动时正确加载,在使用过程中更改并正确保存以供下次启动。这个循环似乎没有问题。

当我为新版本更新程序集和文件版本时,就会出现问题。启动时不再加载设置(而是使用默认值)。即使启动了 1.2 版并生成并保存了新的配置文件,从 1.1 版保存的配置文件似乎也将持续存在(即,您可以重新启动 1.1 版,配置文件将是从该版本保存的配置文件版本)。

因此,这些设置似乎特定于程序集和/或文件的版本。还值得注意的是,在 1.1 版和 1.2 版之间,settings.settings 文件或其他任何内容都没有更改(即我在这些不同版本之间所做的唯一更改是修改版本号)。

有没有办法在版本更改中保留这些设置?

【问题讨论】:

Retaining settings between upgrades 在使用 .Net Settings 类时可能是另一个挑战。这篇文章开头的链接有答案。 我在this thread 中发布了一个可能的解决方案。希望有帮助! 我在以下线程中发布了一个可能的解决方案:***.com/a/47921377/3223783希望对您有所帮助! 【参考方案1】:

一些澄清:

您必须调用ApplicationSettingsBase 派生类的Upgrade 方法(通常称为Settings,由Visual Studio 为您创建):

Properties.Settings.Default.Upgrade();

何时/何地调用Upgrade 方法?您可以应用一个简单的技巧:将名为UpgradeRequired(示例)的用户设置定义为bool(最简单的方法是通过IDE)。确保其默认值为true

在应用程序的开头插入这段代码:

  if (Properties.Settings.Default.UpgradeRequired)
  
      Properties.Settings.Default.Upgrade();
      Properties.Settings.Default.UpgradeRequired = false;
      Properties.Settings.Default.Save();
  

因此 Upgrade 方法只会在版本更改后调用一次(因为您通过设置 UpgradeRequired = false 禁用进一步升级直到版本更改 - 当属性恢复默认值 true 时)。

【讨论】:

除了UpgradeRequired之外,我会将应用程序的版本存储为设置,而不是/。这允许您执行自定义升级转换(即,将无效值/有效值转换为 - 最新版本的默认值/ - 相同值以外的值)。您可以拥有将需要转换的每个适用版本转换为需要它的下一个最低版本的代码,并将代码菊花链在一起,从而:a)降低最新版本转换代码的复杂性,b)允许潜在的旧转换代码退役。 【参考方案2】:

Markus Olsson 已经给出了很好的答案here。

基本上你需要使用ApplicationSettingsBase.Upgrade() 方法。

【讨论】:

感谢您提供的信息!!它现在已经编译、测试、按预期工作,现在完全集成到项目中!!我会尽可能奖励你赏金(显然我必须等待接受这个答案 - 应该是今天晚些时候或明天)。 :D【参考方案3】:

我希望其他人有更好的答案。几年前我有这个问题,我能找到的唯一解决方案(确实有效)是使用我自己的机制来存储设置,而不是默认的内置 .NET 方式。

【讨论】:

感谢您分享您的经验...我很震惊我现在没有一个简单明了的答案(通过 SO 和我都试图自己在文档)。这让我相信这是不可能的……这对于一个看起来很节省时间的功能来说几乎是完全无用的,这对于绝大多数项目来说都是疯狂的。

以上是关于如何在文件版本更改中保留 .settings/.config 文件中的更改?的主要内容,如果未能解决你的问题,请参考以下文章

sh 还原对已修改文件的更改/删除未跟踪文件/从存储库中删除文件,但保留文件的本地版本混帐

如何在 Appengine 中保留数据存储实体的版本历史记录

如何更改应用名称并保留当前用户?

SVN 从存储库中删除更改,但将它们保留在我的结帐中?

动态更改的 Python 打开文件路径

如何在 GitHub 主仓库中获取新文件