使用像“[] Server”这样的键进入sortedDictionary,但为什么呢?

时间:2011-09-15 00:17:10

标签: c#

我正在尝试理解并可能重用部分DevExpress演示代码以将简单设置保存到ini文件中。我知道我可以使用.NET System.Configuration做我想要的。只是为了一个小项目,简单地将其保存为文本文件似乎更灵活,重量更轻,至少看起来就是这样。

无论如何,当我正在玩它时,我试图理解为什么我正在阅读的代码试图将键添加为“[] Server”和“[] DBFormat”作为键名。他们这样做是因为我无法理解的原因,我可能会在这里使用一些帮助。

以下是我认为相关的准则:

 public class IniFile {
        SortedDictionary<string, string> data = new SortedDictionary<string, string>();
        ...
        public void Load(string path) {
            using(StreamReader sr = new StreamReader(path)) {
                string folder = "[]";
                while(!sr.EndOfStream) {
                    string s = sr.ReadLine().Trim();
                    if(s.Length == 0 || s[0] == ';') continue;
                    if(s[0] == '[') {
                        folder = s;
                        continue;
                    }
                    string key, value;
                    int delim = s.IndexOf('=');
                    if(delim < 0) {
                        key = folder + s.Replace("[", string.Empty).Replace("]", string.Empty);
                        value = string.Empty;
                    } else {
                        key = folder + s.Remove(delim).TrimEnd().Replace("[", string.Empty).Replace("]", string.Empty);
                        value = s.Substring(delim + 1).TrimStart();
                    }
                    if(!data.ContainsKey(key)) data.Add(key, value);
                    else data[key] = value;
                }
            }
        }
        ...
        public void Save(string path) {
            using(StreamWriter sw = new StreamWriter(path)) {
                string folder = "[]";
                foreach(string key in data.Keys) {
                    int delim = key.IndexOf(']');
                    string keyFolder = key.Remove(delim + 1);
                    string keyName = key.Substring(delim + 1);
                    if(keyFolder != folder) {
                        folder = keyFolder;
                        sw.WriteLine(folder);
                    }
                    sw.WriteLine(keyName + " = " + data[key]);
                }
            }
        }

        void AddRawValue(string key, string value) {
            key = key.Trim();
            value = value.Trim();
            int folderBegin = key.IndexOf('[');
            int folderEnd = key.IndexOf(']');
            if(folderBegin != 0 || folderEnd < 0) throw new ArgumentException("key");
            data.Add(key, value);
        }

这是ini文件本身的一部分:

DBFormat = "Mdb"
Login = "admin"
Password = ""
Server = "(localhost)"

很明显,出于某些原因,他们不得不将[]添加到keyname中,但最终却没有在演示数据中使用它。我认为他们在[]中使用字符串来分组设置?

1 个答案:

答案 0 :(得分:1)

我只是浏览了它,但我认为意图可能是"[section]setting",因此"[]setting"代表某个部分中的设置而不是。看看获取值是多么容易,只需要一个字符串即可! (“部分”和“文件夹”之间似乎存在混淆 - 这可能是该代码的一个高于变量的变量名称......)

然后再次,我可能会离开,因为我只投入了大约10秒的时间在该肚子上:>)

快乐的编码。