如何在Windows Forms应用程序中保存应用程序设置?

652
我想实现的很简单:我有一个使用路径读取信息的Windows Forms (.NET 3.5)应用程序。用户可以使用我提供的选项表单修改此路径。
现在,我希望将此路径值保存到文件中以备后用。这将是保存到该文件的许多设置之一。该文件将直接位于应用程序文件夹中。
我了解到有三个选择:
ConfigurationSettings文件(appname.exe.config)     注册表     自定义XML文件
据我所知,.NET配置文件不适用于将值保存回去。至于注册表,我希望尽可能远离它。
这是否意味着我应该使用自定义XML文件来保存配置设置?
如果是这样,我想看到C#代码示例。
我看过其他关于此主题的讨论,但对我来说仍不清楚。

1
这是一个.NET WinForms应用程序吗?如果是的话,您正在开发哪个版本的.NET? - Portman
2
是的,它是一个 .NET Framework 版本为 3.5 的 WinForms 应用程序。 - Fueled
1
你需要保存密码或机密值吗?也许需要进行加密。 - Kiquenet
14个回答

6

除了使用自定义的XML文件外,我们还可以使用更用户友好的文件格式:JSON或YAML文件。

  • 如果您使用.NET 4.0 dynamic,那么这个库非常容易使用(序列化、反序列化、支持嵌套对象和按您希望的顺序排序输出+将多个设置合并为一个)JsonConfig(用法等同于ApplicationSettingsBase)
  • 对于.NET YAML配置库...我还没有找到一个像JsonConfig一样容易使用的

您可以将设置文件存储在多个特殊文件夹中(适用于所有用户和每个用户),如此处所列Environment.SpecialFolder枚举,以及多个文件(默认只读、按角色、按用户等)

如果您选择使用多个设置,则可以合并这些设置:例如,合并默认+BasicUser+AdminUser的设置。您可以使用自己的规则:最后一个覆盖该值等。


4
据我所知,.NET 支持使用内置的应用程序设置功能来持久化设置:

Windows Forms 的应用程序设置功能使得在客户端计算机上创建、存储和维护自定义的应用程序和用户偏好设置变得容易。通过 Windows Forms 应用程序设置,你不仅可以存储应用程序数据(例如数据库连接字符串),还可以存储用户特定的数据,如用户应用程序偏好设置。使用 Visual Studio 或自定义托管代码,你可以创建新设置,在磁盘上读取和写入它们,将它们绑定到表单上的属性,并在加载和保存设置数据之前验证设置数据。 - http://msdn.microsoft.com/en-us/library/k4s6c3a0.aspx


2
不是这样的,可以参考上面Aku的回答。使用Settings和ApplicationSettingsBase是可以实现的。 - Gishu

3
有时候,您想要摆脱传统的 web.config 或 app.config 文件中保存的那些设置。您希望更加精细地控制设置条目和分离数据设计的部署。或者要求在运行时添加新条目。
我可以想象两个好的选择:
- 强类型版本和 - 面向对象版本。
强类型版本的优点是具有强类型设置名称和值。没有混淆名称或数据类型的风险。缺点是需要编写更多的设置,不能在运行时添加。
使用面向对象版本的优点是可以在运行时添加新设置。但您没有强类型名称和值。必须小心处理字符串标识符。在获取值时必须知道先前保存的数据类型。
您可以在此处找到两种完全功能实现的代码。

2
public static class SettingsExtensions
{
    public static bool TryGetValue<T>(this Settings settings, string key, out T value)
    {
        if (settings.Properties[key] != null)
        {
            value = (T) settings[key];
            return true;
        }

        value = default(T);
        return false;
    }

    public static bool ContainsKey(this Settings settings, string key)
    {
        return settings.Properties[key] != null;
    }

    public static void SetValue<T>(this Settings settings, string key, T value)
    {
        if (settings.Properties[key] == null)
        {
            var p = new SettingsProperty(key)
            {
                PropertyType = typeof(T),
                Provider = settings.Providers["LocalFileSettingsProvider"],
                SerializeAs = SettingsSerializeAs.Xml
            };
            p.Attributes.Add(typeof(UserScopedSettingAttribute), new UserScopedSettingAttribute());
            var v = new SettingsPropertyValue(p);
            settings.Properties.Add(p);
            settings.Reload();
        }
        settings[key] = value;
        settings.Save();
    }
}

你能澄清一下设置文件在哪里吗?或者它长什么样子? - Moiyd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接