Saving/Restoring Winforms 中的多个设置文件

Saving/Restoring multiple settings files in Winforms

我在 WinForms 应用程序的 Properties 文件夹中有 3 个设置文件。它们是默认设置、工具和车辆。设置一切正常。

我使用以下代码从 user.config 中导出设置:

internal static void Export(string settingsFilePath)
{
    Properties.Settings.Default.Save();
    var config = configurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    config.SaveAs(settingsFilePath);
}

并恢复:

internal static void Import(string settingsFilePath)
{
    if (!File.Exists(settingsFilePath))
    {
        throw new FileNotFoundException();
    }

    var appSettings = Properties.Settings.Default;
    try
    {
        var config = ConfigurationManager.OpenExeConfiguration(
            ConfigurationUserLevel.PerUserRoamingAndLocal);

        string appSettingsXmlName = 
            Properties.Settings.Default.Context["GroupName"].ToString(); 
        // returns "MyApplication.Properties.Settings";

        // Open settings file as XML
        var import = XDocument.Load(settingsFilePath);
        // Get the whole XML inside the settings node
        var settings = import.XPathSelectElements("//" + appSettingsXmlName);

        config.GetSectionGroup("userSettings")
            .Sections[appSettingsXmlName]
            .SectionInformation
            .SetRawXml(settings.Single().ToString());
        config.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection("userSettings");

        appSettings.Reload();
    }
    catch (Exception) // Should make this more specific
    {
        // Could not import settings.
        appSettings.Reload(); // from last set saved, not defaults
    }
}

我想做的只是提取,例如,仅提取部分 Properties.Vehicle.Default 设置并更新 user.config 仅更改部分组“userSettings”的该部分。目的是保存车辆加载其设置以供使用 - 但不更改设置或工具设置。

<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="Drive.Properties.Tool" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    <section name="Drive.Properties.Vehicle" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    <section name="Drive.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />

然而代码行:

config.GetSectionGroup("userSettings")
            .Sections[appSettingsXmlName]
            .SectionInformation
            .SetRawXml(settings.Single().ToString());
        config.Save(ConfigurationSaveMode.Modified);

只允许我隔离 userSettings,以便加载所有部分并覆盖用户配置。我已经尝试了部分名称,但由于它不是一个组,因此 return 为空。

那么有什么方法可以指定从我导出的 xml 文件的 sectionGroup 中仅提取其中一个部分并更新 user.config 只有该部分而不影响其他部分?

我很接近 - 但还不够接近。谢谢。

假设您有三个设置 SettingsA.settings,并且 Settings.Settings:

  • 这些设置的默认值将作为应用程序配置文件 (<YourAppName>.exe.config) 中 userSettings 部分组的部分存储在您的应用程序文件旁边。

  • 这些设置的用户值将作为 userSettingsd 部分组的部分存储在 user.config 文件中 %userprofile%\appdata\local\<YourAppName>\<Hash>\<Version>

  • 以下代码将所有当前用户配置保存到一个文件中,包括 SettingsA 和 Settings.它基本上就像复制包含当前用户值的 user.config 文件:

    ConfigurationManager
        .OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        .SaveAs(path);
    
  • 以下代码将从您使用上述代码创建的备份文件中仅恢复 SettingsA

    var config = ConfigurationManager
       .OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
    string sectionName = Properties.SettingsA.Default.Context["GroupName"].ToString();
    var document = XDocument.Load(Path.Combine(Application.StartupPath, path));
    var settingsA = document.XPathSelectElements($"//{sectionName}")
        .Single().ToString();
    config.GetSectionGroup("userSettings")
        .Sections[sectionName].SectionInformation.SetRawXml(settingsA);
    config.Save(ConfigurationSaveMode.Modified);
    Properties.SettingsA.Default.Reload();