3

ApplicationSettingsBaseから継承するオブジェクトによってuser.configに保存されている多くのユーザースコープ設定があります。

各インスタンスのSettingsKeyは、主にフォーム名を使用して実行時に動的に導出されます。したがって、数百になる可能性があります。

私は多くの質問と回答を読みました(これのように-.netのさまざまなアセンブリバージョン間でuser.config設定をどのように保持しますか? )これらはすべて、バージョン番号チェックでApplicationSettingsBase.Upgrade()呼び出しをラップすることを推奨しています。

問題は、(私が知る限り)すべてのApplicationSettingsBaseオブジェクトをインスタンス化してupgradeメソッドを呼び出すために使用されるすべての* SettingsKey(値を知る必要があることです。

すべてのuser.config設定を一度にアップグレードする方法はありますか、またはファイル内のすべての設定を繰り返してアップグレードする方法はありますか?

4

1 に答える 1

1

私が思いついたアプローチは私が感じるハックのようなものですが、あまりにも多くのアプローチが失敗し、私は物事を続ける必要があります:-(

新しいバージョンが実行されている場合は、以前のバージョンの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);
}
}

PreviousSettingsDirを取得する中央のLinqについて、この質問(保存されたデータ型が変更されたときにSettings.settingsをどのようにアップグレードしますか? )に答えてくれたAllonGuralnekに感謝します。

于 2013-02-13T02:26:09.627 に答える