存储和检索应用程序设置的正确方法是什么?

时间:2012-08-22 07:18:08

标签: c# settings storage appsettings

我主要是C#.NET 4.0开发人员,现在我正在重新考虑过去存储和检索应用程序设置的方法。

在过去,我使用了各种方法,从简单的“扁平”文本文件到制表符分隔的键/值,到分层的XML文件,以及其他一些方法。我过去曾经使用过(并且正在考虑再次使用)内置的App.Config / AppSettings类,但是没有任何内置的方法来保存您从此源加载的数据(我可以进入我在做这件事时遇到的困难,但这不是问题的重点。)

这里的要点是,所有这些方法都有其缺点,虽然有些方法比其他方法更好,但有些方法比其他方法更容易使用,我试图确定一致且可靠的方法。

我的问题,可能会有一些有效的答案,所以我将被迫选择最好的答案,这是:如果有任何内置框架,你会建议保存和加载数据可以附带可执行文件的设置文件,或者如果不是内置框架,您会推荐什么标准? XML? '平'文件?独立数据库?

假设配置本身不会那么大,并且将从数据库(或使用其他一些技术)读取任何实际数量的数据。

3 个答案:

答案 0 :(得分:2)

虽然我是一个注册表粉丝,并且宁愿在那里设置我的设置,但我使用了我的c#apps我使用了内置的设置 - 所以在项目属性下你可以定义一个加载及其默认值,然后访问他们与

Properties.Settings.Default.<settingname>

也可以设置它们,所以Properties.Settings.Default.HideDisabled = true;

您可以使用

保存它们
Properties.Settings.Default.Save();

我没有遇到过这方面的问题,但是,正如你所说的那样,一切都有赞成和反对。

答案 1 :(得分:1)

另一种方式(kernel32),它与C#甚至C#4.0并不多,但是因为我们已经启动了变体列表,所以它必须在这里有效

namespace Ini {
    public class IniFile {
        private string path;
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section,
            string key, string val, string filePath);
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section,
                    string key, string def, StringBuilder retVal,
            int size, string filePath);
        public IniFile(string INIPath) {
            path = INIPath;
            }
        public void IniWriteValue(string Section, string Key, string Value) {
            WritePrivateProfileString(Section, Key, Value, this.path);
            }
        public string IniReadValue(string Section, string Key) {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp,
                                            255, this.path);
            return temp.ToString();
            }
        }
    }

答案 2 :(得分:1)

我参与过的一些应用程序涉及本地数据库,我们也使用该数据库文件来保存我们的设置。它有效,但它只是感觉有点不对,如果您希望能够在应用程序未运行时修改设置,则可能会出现问题。 (绕过崩溃或类似的东西。)

我经常使用存储在Environment.SpecialFolder.ApplicationData文件夹中的XML文件并使用DataContractSerializer。它允许您进行一些版本控制,但最重要的是,当您的设置对象上的某些属性是新的或不存在时,它能够加载和保存XML文件。它不会使应用程序崩溃,当您再次保存设置时,它只会保存最新版本。我认为这很干净,很简单。