代码之家  ›  专栏  ›  技术社区  ›  DigitalJedi805

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

  •  5
  • DigitalJedi805  · 技术社区  · 12 年前

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

    在过去,我使用了多种方法,从带有制表符分隔键/值的简单“平面”文本文件到分层XML文件,以及介于两者之间的其他一些方法。我过去使用过(现在正在考虑再次使用)内置的App.Config/AppSettings类,但没有任何内置的方法来保存您从这个源加载的数据(我可能会遇到这样做的困难,但这不是问题的重点)。

    这里的重点是,所有这些方法都有其缺点,虽然有些方法比其他方法更好,但有些方法比另一些方法更容易使用,我正在努力确定一些一致和可靠的方法。

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

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

    3 回复  |  直到 12 年前
        1
  •  3
  •   BugFinder    12 年前

    虽然我是一个注册表迷,我更希望在那里有我的设置,但在我的c#应用程序中,我使用了内置的设置,所以在项目属性下,你可以定义负载及其默认值,然后使用

    Properties.Settings.Default.<settingname>
    

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

    你可以用

    Properties.Settings.Default.Save();
    

    我对此没有意见,但正如你所说,一切都有赞成和反对之分。

        2
  •  1
  •   cnd    12 年前

    另一种方式(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();
                }
            }
        }
    
        3
  •  1
  •   Jensen    12 年前

    我处理过的一些应用程序涉及本地数据库,我们也使用该数据库文件来保存我们的设置。它是有效的,但有些地方感觉有点不对,如果你想在应用程序不运行时修改设置,这可能会成为一个问题。(绕过车祸或类似事件。)

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