.NET有没有类似于Java的.properties文件的等效物?

27
为了提醒大家,Java有一些后缀名为“.properties”的文件,它们基本上是一个ASCII文本文件,里面充满了键值对。这个框架有一些非常简单的方法将该文件导入(本质上)到一个漂亮的哈希映射中。
我认为两个最大的优点是:
1.极其容易手动编辑和读写。
2..NET有相应的功能吗?当然了,我可以用XML文件做同样的事情,但如果您知道我的意思,我不想手动输入所有那些角括号。此外,一行代码将所有数据吸入内存中的方式也很不错。
(旁注:我有点不敢相信这个问题还没有被问过,但我找不到这样的问题。)
编辑:
为了回答一些评论暗示的问题,我不是在寻找在.NET下特定读取java .properties文件的方法,我正在寻找.NET世界的功能等效物。(并且我希望它不是基于XML的,可能忘记了我们正在谈论.NET。)
而且,虽然配置文件接近,但我需要一种存储任意字符串的方法,而不是应用程序配置信息,因此配置文件的重点和设计似乎不太合适。

存在重复问题:https://dev59.com/nHRB5IYBdhLWcg3w3K4J - skaffman
这两个问题看起来很相似: https://dev59.com/nHRB5IYBdhLWcg3w3K4J https://dev59.com/eHVC5IYBdhLWcg3wqzLV - ziya
根据作者的意图,这可能不是一个重复内容(尽管作者不太喜欢XML会让它看起来像一个重复内容)。如果这不是一个重复内容,安德鲁·哈尔已经提供了唯一可能的答案。 - Jason D
嗯,是的 - 我并不是在寻找读取 .properties 文件的方法;我只是想知道 .net 的等效方法是什么。(而且希望有一个非基于 XML 的解决方案,但话说回来,我们正在谈论的是 .net。)我会清理问题中的文本,以使其更加清晰明了。 - Electrons_Ahoy
类似 JSON.net 这样的东西是否符合要求? - radarbob
6个回答

17
你可以使用内置的设置文件(在VS中添加新的“设置文件”)来实现类似于属性文件的功能,但它仍然基于XML。
您可以使用自动生成的Settings类访问设置,甚至更新它们并将它们保存回配置文件-所有这些都无需编写任何样板代码。这些设置是强类型的,并且可以指定为“用户”(保存到用户的应用程序数据文件夹)或“应用程序”(保存到运行exe的同一文件夹)。

8
.NET 的做法是使用配置文件。.NET 框架甚至提供了一个用于处理它们的 API。请参考:配置文件,以及相关 API

4
配置文件不只是用来配置应用程序数据的吗?我只是想要一种简单的方式从文本文件中提取一些字符串,而不希望框架认为我正在尝试配置某些东西。 :) - Electrons_Ahoy

5

有一个第三方组件叫做nini,可以在sourceforge.net上找到。

以下是一个示例:

using Nini;
using Nini.Config;
namespace niniDemo{ public class niniDemoClass{ public bool LoadIni(){ string configFileName = "demo.ini"; IniConfigSource configSource = new IniConfigSource(configFileName);
IConfig demoConfigSection = configSource.Configs["Demo"]; string demoVal = demoConfigSection.Get("demoVal", string.Empty); } }
}

上面示例中的'demo.ini'文件应该是这样的:

[Demo]
demoVal = foobar

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


4

2

我无法找到一个类似于使用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文件。


1
根据 https://en.wikipedia.org/wiki/.properties,您不仅要查找 =s,还要查找 : 和 (空格)。 - Happypig375

0

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

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

1
你应该添加一个检查,确保键不以;#'开头并且不包含= - CodesInChaos
你应该将它们进行转义(从#\#),而不是删除它们。 - Happypig375

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