2010-01-30 131 views
20

为了慢跑每个人的记忆,Java将这些文件扩展名为“.properties”,它们基本上是一个充满键值对的ASCII文本文件。该框架有一些真正简单的方法来将该文件吸入(本质上)一个奇特的散列表。.NET是否具有与Java的.properties文件等效的功能?

两个很大的优点(正如我所看到的)非常易于手动编辑和读/写。

.NET是否有等价的烘焙?当然,我可以用一个XML文件来做同样的事情,但如果你知道我的意思,我宁愿不必手动输入所有尖括号。另外,一种将所有数据吸入到一行内存中的数据结构的方法也不错。

(边栏:我有点不能相信这并没有在这里已经问过,但我找不到这样的问题)

编辑:

要回答所隐含的问题一些评论,我没有找到专门阅读.NET下的java.properties文件的方法,我正在寻找.NET世界中的功能等价物。 (我希望它不会基于XML,明显忘记这是我们正在谈论的.NET。)

而且,虽然配置文件是关闭,我需要一些方法来存储一些任意字符串,而不是应用程序配置信息,所以配置文件的焦点和设计看起来非基础。

+0

有一个DUP:http://stackoverflow.com/questions/485659/can-c-load-and-parse-a-properties-file-equivilant- to-java-properties-class – skaffman 2010-01-30 22:32:59

+0

这些看起来类似: http://stackoverflow.com/questions/485659/can-c-load-and-parse-a-properties-file-equivilant-to-java-properties-class http://stackoverflow.com/questions/217902/reading-writing-ini-file-in-c – ziya 2010-01-30 22:38:14

+0

根据作者的意图,这可能不是一个重复。 (尽管看起来作者并不热衷于XML)Andrew Hare已经提供了唯一可能的答案,如果这不是重复的话。 – 2010-01-30 22:38:56

回答

12

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

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

+1

啊哈!那正是我所期待的。谢谢! – 2010-01-31 01:20:45

8

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

+3

配置文件是不是只适用于应用程序配置数据?我真的只想要一个简单的方法来从文本文件中拉出一些字符串。我不希望框架认为我正在尝试配置某些东西。 :) – 2010-01-31 01:29:41

4

有一个名为妮妮第三方组件可在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的值为空或空,则默认为string.Empty

+0

Oooh,整齐。很高兴知道!谢谢! – 2010-01-31 01:28:44

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 2013-06-17 15:24:19

+0

你实际上应该将它们转义('#'到'\#')而不是删除它们。 – Happypig375 2016-07-24 04:24:09

2

我没有能够通过使用C#找到所读取属性文件一个similer溶液。我能够通过使用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; 
    } 

我Idea-

我个人认为,属性文件访问更加方便用户不是访问XML文件。

因此,如果您尝试更好地将某些属性外化为使用属性文件而不是XML。

+1

根据https://en.wikipedia.org/wiki/.properties – Happypig375 2016-07-24 04:22:50

1

我写了一个名为DotNet.Config的小型.NET配置库,它使用受Java的.property文件启发的基于文本的简单属性文件。它包含一些很好的功能,以便于加载。您可以在这里抢一个副本:

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

+0

,您不希望仅查找= s,而是:和(空格键)此库更好一些https://github.com/ aloneguid /配置 – 2016-10-25 21:50:42

相关问题