Pergunta

Para refrescar a memória de todos, Java possui esses arquivos com extensão ".properties", que são basicamente um arquivo de texto ASCII cheio de pares de valores-chave.A estrutura tem algumas maneiras realmente fáceis de transformar esse arquivo em (essencialmente) um hashmap sofisticado.

As duas grandes vantagens (a meu ver) são a extrema facilidade de edição manual e leitura/escrita.

O .NET tem um equivalente integrado?Claro, eu poderia fazer o mesmo com um arquivo XML, mas prefiro não ter que digitar à mão todos esses colchetes angulares, se é que você me entende.Além disso, uma maneira de sugar todos os dados para uma estrutura de dados na memória em uma linha também é boa.

(Barra Lateral:Eu meio que não posso acreditar que isso já não tenha sido perguntado aqui, mas não consegui encontrar essa pergunta.)

Editar:

Para responder à pergunta implícita em alguns dos comentários, não estou procurando uma maneira de ler especificamente arquivos java .properties no .NET, estou procurando o equivalente funcional no universo .NET.(E eu esperava que não fosse baseado em XML, aparentemente tendo esquecido que estamos falando de .NET.)

E, embora os arquivos de configuração sejam fechar, preciso armazenar algumas strings arbitrárias, não informações de configuração do aplicativo, para que o foco e o design dos arquivos de configuração pareçam inadequados.

Foi útil?

Solução

Você pode obter uma peça de funcionalidade semelhante aos arquivos de propriedades usando o embutido Configurando arquivos (Em vs, adicione um novo "arquivo de configurações") - mas ainda é baseado em XML.

Você pode acessar as configurações usando a classe Configurações geradas automaticamente e até atualizá -las e salvá -las de volta ao arquivo de configuração - tudo sem gravar nenhum código de boilerplate. As configurações são fortemente tipos e podem ser especificadas como "usuário" (salvo na pasta de dados do aplicativo do usuário) ou "Aplicativo" (salvo na mesma pasta que o exe Exe em execução).

Outras dicas

A maneira .Net é usar um arquivo de configuração. A estrutura .NET até ofereceuma API para trabalhar com eles.

Há um componente de terceiros chamado Nini que pode ser encontrado em sourceforge.net

Por exemplo:

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

}

O arquivo 'Demo.ini' da amostra acima seria:

[Demo]
demoVal = foobar

Se o valor de demoVal é nulo ou vazio, ele padroniza para string.Empty.

Não consegui encontrar uma solução Similer para o arquivo de propriedades de leitura usando C#. Consegui escrever um código próprio usando o C# para obter o mesmo resultado do mesmo em Java.

Siga é o código:

 // 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;
    }

Minha ideia-

Pessoalmente, acredito que o acesso ao arquivo de propriedades é muito mais fácil de usar do que acessar arquivos XML.

Portanto, se você tentar externalizar uma propriedade de atributo melhor para usar o arquivo de propriedades do que o XML.

Eu escrevi uma pequena biblioteca de configuração .NET chamada DotNet.Config que usa arquivos de propriedades baseados em texto simples inspirados nos arquivos .property do Java.Inclui alguns recursos interessantes para facilitar o carregamento.Você pode pegar uma cópia aqui:

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

Pessoalmente, gosto deste código que encontrei na web. É uma maneira personalizada de ler/gravar em um arquivo de propriedades.

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 { }
            }
        }
    }
}

Exemplo de uso:

//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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top