【问题标题】:Does .NET have an equivalent to Java's .properties files?.NET 是否与 Java 的 .properties 文件等效?
【发布时间】:2011-01-11 07:12:19
【问题描述】:

为了唤起大家的记忆,Java 有这些扩展名为“.properties”的文件,它们基本上是一个充满键值对的 ASCII 文本文件。该框架有一些非常简单的方法可以将该文件吸入(基本上)一个花哨的哈希图。

两大优势(如我所见)是手写编辑和阅读/写作都极其轻松。

.NET 是否有类似的功能?当然,我可以对 XML 文件执行相同的操作,但如果您知道我的意思,我宁愿不必手动键入所有这些尖括号。此外,一种将所有数据在一行中吸入内存中数据结构的方法也很不错。

(边栏:我有点不敢相信这里还没有人问过这个问题,但我找不到这样的问题。)

编辑:

为了回答一些 cmets 隐含的问题,我不是在寻找一种专门读取 .NET 下的 java .properties 文件的方法,而是在寻找 .NET 世界中的等效功能。 (我希望它不会是基于 XML 的,显然忘记了我们正在谈论的是 .NET。)

而且,虽然配置文件关闭,但我需要存储一些任意字符串的方法,而不是应用程序配置信息,因此配置文件的重点和设计似乎脱离了基础。

【问题讨论】:

  • 根据作者的意图,这可能不是一个重复。 (尽管鉴于作者并不热衷于 XML,这似乎是一个问题)如果这不是重复,Andrew Hare 已经提供了唯一可能的答案。
  • 嗯,是的 - 我不是在寻找一种专门阅读 .properties 的方法;我只是想知道.net 等价物是什么。 (并且希望有一个非基于 xml 的解决方案,但话又说回来,这是我们正在谈论的 .net。)我将清理问题中的文本以使其更加清晰。
  • 会像JSON.net 这样的东西来填单吗?

标签: java .net properties-file


【解决方案1】:

您可以使用内置的settings files 实现与属性文件类似的功能(在 VS 中,添加一个新的“设置文件”) - 但它仍然是基于 XML 的。

您可以使用自动生成的 Settings 类访问设置,甚至可以更新它们并将它们保存回配置文件 - 所有这些都无需编写任何样板代码。设置为强类型,可以指定为“User”(保存到用户的Application Data文件夹)或“Application”(保存到与运行的exe相同的文件夹)。

【讨论】:

    【解决方案2】:

    .NET 方法是使用configuration file。 .NET 框架甚至提供 an API for working with them.

    【讨论】:

    • 配置文件不只是用于应用程序配置数据吗?我真的只是想要一种简单的方法来从文本文件中提取一些字符串。我不希望框架认为我正在尝试配置某些东西。 :)
    【解决方案3】:

    有一个名为 nini 的第三方组件,可以在 sourceforge.net 找到

    举个例子:

    使用妮妮; 使用 Nini.Config; 命名空间 niniDemo{ 公共类 niniDemoClass{ 公共布尔LoadIni(){ 字符串 configFileName = "demo.ini"; IniConfigSource configSource = new IniConfigSource(configFileName); IConfig demoConfigSection = configSource.Configs["Demo"]; 字符串 demoVal = demoConfigSection.Get("demoVal", string.Empty); } } }

    上述示例的“demo.ini”文件为:

    [演示] demoVal = foobar

    如果demoVal的值为null或为空,则默认为string.Empty

    【讨论】:

      【解决方案4】:

      我编写了一个名为DotNet.Config 的小型.NET 配置库,它使用受Java .property 文件启发的基于简单文本的属性文件。它包括一些易于加载的不错的功能。您可以在此处获取副本:

      https://github.com/jknight/DotNet.Config

      【讨论】:

        【解决方案5】:

        我无法使用 c# 找到读取属性文件的类似解决方案。我能够通过使用 c# 编写自己的代码来获得与 java 相同的结果。

        以下是代码:

         // watchValue- Property attribute which you need to get the value;
         public string getProperty(string watchValue) 
            {
               // string propertiesfilename= @"readFile.properties";
        
                string[] lines = System.IO.File.ReadAllLines(propertiesfilename);
                    for (int i = 0; i < lines.Length; i++)
                    {
                        string prop_title = Regex.Split(lines[i], "=")[0].Trim();
                        if (prop_title == watchValue)
                            return Regex.Split(lines[i], "=")[1].Trim();
                    }
                    return null;
            }
        

        我的想法-

        我个人认为属性文件访问比访问 XML 文件更易于用户使用。

        因此,如果您尝试将某些属性属性外部化,则使用属性文件比使用 XML 更好。

        【讨论】:

        【解决方案6】:

        我个人喜欢我在网上找到的这段代码。这是一种在属性文件中读/写的个性化方式。

        public class Properties
        {
            private Dictionary<String, String> list;
        
            private String filename;
        
            public Properties(String file)
            {
                reload(file);
            }
        
            public String get(String field, String defValue)
            {
                return (get(field) == null) ? (defValue) : (get(field));
            }
            public String get(String field)
            {
                return (list.ContainsKey(field))?(list[field]):(null);
            }
        
            public void set(String field, Object value)
            {
                field = this.trimUnwantedChars(field);
                value = this.trimUnwantedChars(value);
        
                if (!list.ContainsKey(field))
                    list.Add(field, value.ToString());
                else
                    list[field] = value.ToString();
            }
        
            public string trimUnwantedChars(string toTrim)
            {
                toTrim = toTrim.Replace(";", string.Empty);
                toTrim = toTrim.Replace("#", string.Empty);
                toTrim = toTrim.Replace("'", string.Empty);
                toTrim = toTrim.Replace("=", string.Empty);
                return toTrim;
            }
        
            public void Save()
            {
                Save(this.filename);
            }
        
            public void Save(String filename)
            {
                this.filename = filename;
        
                if (!System.IO.File.Exists(filename))
                    System.IO.File.Create(filename);
        
                System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
        
                foreach(String prop in list.Keys.ToArray())
                    if (!String.IsNullOrWhiteSpace(list[prop]))
                        file.WriteLine(prop + "=" + list[prop]);
        
                file.Close();
            }
        
            public void reload()
            {
                reload(this.filename);
            }
        
            public void reload(String filename)
            {
                this.filename = filename;
                list = new Dictionary<String, String>();
        
                if (System.IO.File.Exists(filename))
                    loadFromFile(filename);
                else
                    System.IO.File.Create(filename);
            }
        
            private void loadFromFile(String file)
            {
                foreach (String line in System.IO.File.ReadAllLines(file))
                {
                    if ((!String.IsNullOrEmpty(line)) &&
                        (!line.StartsWith(";")) &&
                        (!line.StartsWith("#")) &&
                        (!line.StartsWith("'")) &&
                        (line.Contains('=')))
                    {
                        int index = line.IndexOf('=');
                        String key = line.Substring(0, index).Trim();
                        String value = line.Substring(index + 1).Trim();
        
                        if ((value.StartsWith("\"") && value.EndsWith("\"")) ||
                            (value.StartsWith("'") && value.EndsWith("'")))
                        {
                            value = value.Substring(1, value.Length - 2);
                        }
        
                        try
                        {
                            //ignore duplicates
                            list.Add(key, value);
                        }
                        catch { }
                    }
                }
            }
        }
        

        使用示例:

        //load
        Properties config = new Properties(fileConfig);
        //get value whith default value
        com_port.Text = config.get("com_port", "1");
        //set value
        config.set("com_port", com_port.Text);
        //save
        config.Save()
        

        【讨论】:

        • 您应该添加一个检查以确保密钥不以;#' 开头并且不包含=
        • 您实际上应该将它们转义(#\#)而不是删除它们。
        猜你喜欢
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 2010-10-04
        • 1970-01-01
        • 2010-09-21
        相关资源
        最近更新 更多