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

5
我主要是一名C# .NET 4.0开发人员,现在正在重新考虑存储和检索应用程序设置的方法。
过去我使用了各种方法,从简单的“平面”文本文件到分层XML文件,以及其中的一些其他方法。我过去使用过(并再次考虑使用)内置的App.Config/AppSettings类,但没有任何内置方法可以保存从此源加载的数据(我可以谈谈我在做这件事时遇到的困难,但这不是问题的重点)。
重点在于,所有这些方法都有其缺点,虽然有些方法比其他方法更有效,有些方法比其他方法更简单易用,但我正在努力确定一些既一致又可靠的东西。
我的问题是,您会推荐任何内置框架来保存和加载数据,并将其与可执行文件一起使用的设置文件吗?如果没有内置框架,您会推荐什么标准? XML? “平面”文件?独立数据库?
假设配置本身不会很大,并且任何实际数量的数据都将从数据库中读取(或使用其他技术)。

好问题,但我认为这是非常个人的。我喜欢kernel32 WritePrivateProfileString,并且我坚信在简单性、稳定性和速度方面没有什么能够超越它。如果您愿意,我可以为C#提供接口。[是的,我不投票关闭] - cnd
虽然这个问题有一定的价值,但你自己已经提出了没有“正确”答案的观点。我也不清楚你对app.config方法存在什么问题(你肯定会将加载的数据保存回app.config中吧?)。你能详细说明一下吗? - Dan Puzey
1
当然,我现在遇到的问题是我的AppSettings字典是只读的,因此我无法删除/添加项目。唯一的解决方法我考虑过是重新编写整个文件来保存我的应用程序设置,但我并不喜欢这种方法。由于这是一种观点问题,因此没有“正确”答案,什么是“最佳”解决方案是有很多潜在的“有效”答案。我只是在寻找最可靠、功能齐全的方法来执行任务。感谢您的评论。 - DigitalJedi805
3个回答

3

虽然我是一个注册表的粉丝,更愿意将我的设置放在那里,但在我的C#应用程序中,我已经使用了内置的设置 - 因此,在项目属性下,您可以定义一个负载及其默认值,然后通过以下方式访问它们:

Properties.Settings.Default.<settingname>

你可以设置它们,比如 Properties.Settings.Default.HideDisabled = true;

然后你可以使用保存它们的方法

Properties.Settings.Default.Save();

我没有遇到过这个问题,但是像你说的,每件事都有利弊。


在我看来,这绝对是存储用户设置的最佳和最方便的方式。 - Matthew Watson
我当然是指应用程序设置,而不是用户设置。 - Matthew Watson
这似乎是一个值得追求的合理方法,但我过去没有使用过。不知道你能否指引我一些使用此方法的“Hello World”或类似的东西? - DigitalJedi805
没事了,我自己解决了。我会在当前项目中尝试这个方法。感谢您的建议。 - DigitalJedi805
本来想说的是:项目属性,设置你想要的属性,我已经展示了如何读取它们,如何设置它们以及如何保存它们 :) 很高兴你解决了问题。 - BugFinder

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();
            }
        }
    }

1
我曾经参与过的一些应用程序涉及本地数据库,我们使用该数据库文件来保存我们的设置。虽然它能够正常工作,但有时感觉有点不对劲,如果您想在应用程序未运行时修改设置,则可能会出现问题(为了避免崩溃或类似情况)。
通常,我会在Environment.SpecialFolder.ApplicationData文件夹中存储一个XML文件,并使用DataContractSerializer。它允许您进行一些版本控制,但最重要的是,当您的设置对象上的某些属性是新的或不存在时,它能够加载和保存XML文件。它不会使应用程序崩溃,当您再次保存设置时,它将只保存最新版本。我认为这很干净、简单而有效。

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