在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 settings only和更新用户。配置只更改sectionGroup "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,以便加载所有部分并覆盖用户配置。我已经尝试了节名,但由于它不是一个组,返回为空。

那么,我是否可以指定只从导出的xml文件中提取sectionGroup中的一个节并更新用户?配置只有该部分留下其他不受影响?

我是如此接近-但还不够接近。谢谢你。

假设您有三个设置SettingsA.settingsSettings.Settings:

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

  • 这些设置的用户值将作为userSettingsdsection组的section存储在%userprofile%appdatalocal<YourAppName><Hash><Version>user.config文件中。

  • 下面的代码将所有当前用户配置保存到一个文件中,包括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();
    

最新更新