将user.config拆分为不同的文件以便更快地保存(在运行时)

时间:2010-05-10 16:59:37

标签: c# file runtime user.config

在我的c#Windows窗体应用程序(.net 3.5 / VS 2008)中,我有3个设置文件,产生一个user.config文件。

一个设置文件由较大的数据组成,但很少更改。频繁更改的数据非常少。但是,由于保存设置总是写入整个(XML)文件,因此总是“慢”。

SettingsSmall.Default.Save(); // slow, even if SettingsSmall consists of little data 

我能否以某种方式配置设置以产生两个文件,从而产生:

SettingsSmall.Default.Save(); // should be fast
SettingsBig.Default.Save(); // could be slow, is seldom saved

我已经看到我可以使用SecionInformation类进行进一步的自定义,但对我来说最简单的方法是什么?这可以通过更改app.config(config.sections)吗?

---添加了有关App.config的信息

我得到一个文件的原因可能是App.config中的configSections。这是它的外观:

  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="XY.A.Properties.Settings2Class" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
      <section name="XY.A.Properties.Settings3Class" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>

当我添加第2和第3个设置文件时,我得到了这些部分。我没有注意到这一点,所以它在某种程度上是VS 2008的默认值。单个user.config有这3个部分,它绝对是透明的。

只有我不知道如何告诉App.config创建三个独立的文件而不是一个。我已经使用上面的app.config“玩了”,但是当我删除配置部分时,我的应用程序终止,但有异常。

3 个答案:

答案 0 :(得分:1)

正如您已经发现的,VS在编译时将项目中的所有配置和设置文件放入一个大的applicationname.exe.config文件中,据我所知,您无法将另一个配置文件作为“主要文件”加载。

一种解决方案是拥有自己的设置类实现,并让它加载另一个文件。

另一种方法是在ConfigurationManager中使用OpenMappedExeConfiguration方法。您可以使用

加载配置文件并访问其appsetting值
ExeConfigurationFileMap map = new ExeConfigurationFileMap();
map.ExeConfigFilename = "test.config";
Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var section = ((AppSettingsSection)configuration.GetSection("appSettings")).Settings;
foreach (string key in section.AllKeys) {
    Console.WriteLine("{0}={1}", key, section[key].Value);
}

您应该能够获得自定义部分并在其上使用Save方法。

答案 1 :(得分:0)

If it is slow , instead of doing in single file you can do it in multiple user.config.

注意:但是当我处理user.settings时,我发现了一个难题,一旦卸载了应用程序,设置就不会从保存的位置中删除,只有管理权限用户才能访问这些文件。因此,请确保您的设置文件是否需要

答案 2 :(得分:0)

最终我使用了自己的设置提供程序来实现我的目标: 我发现两个资源最有用,开始编写这样的提供程序

  1. www.codeproject.com/KB/vb/CustomSettingsProvider.aspx?msg=2934144#xx2934144xx
  2. www.blayd.co.uk/download.aspx?pageid=1013
  3. 我使用了2中的一些修改版本。我可以为每个设置设置要使用的提供程序,所以我坚持使用这种方法。但是,我试图避免长时间编写自己的提供程序,但每当我查看这个主题时,我发现根本没有更好的方法将这些部分拆分成独立的文件。

    然而,我也发现Patrick的方法很有趣,并且我会尽快给它一个试验。谢谢!