2008-11-12 10 views
7

Mi proyecto requiere un archivo donde almacenaré datos de pares clave/valor que el usuario debe poder leer y modificar. Quiero que el programa espere que las claves estén allí, y quiero analizarlas del archivo lo más rápido posible.Análisis más simple de archivos pares de clave/valor en .NET

Podría almacenarlos en XML, pero XML es complejo, y requeriría nodos de cruce, nodos secundarios y demás, todo lo que quiero es una clase que tome un archivo y genere pares de valores clave. Quiero el menor manejo de errores posible, y quiero que se haga con el menor código posible.

Podría codificar una clase así yo mismo, pero preferiría aprender cómo no estar en el marco que inventar la rueda dos veces. ¿Hay alguna clase de magia incorporada en .NET (3.5) que pueda hacerlo?

MagicClass kv = new MagicClass("Settings.ini"); // It doesn't neccesarily have to be an INI file, it can be any simple key/value pair format. 
string Value1 = kv.get("Key1"); 
... 
+0

Como @Nicholas Mancuso señaló, XML serialización no requiere atravesar nodos, etc. – user7116

Respuesta

6

Utilice la clase KeyValuePair para Key y Value, luego simplemente serialice List en el disco con XMLSerializer.

Ese sería el enfoque más simple que siento. No tendrías que preocuparte por atravesar nodos. Llamar a la función Deserializar lo hará por usted. El usuario podría editar los valores en el archivo si así lo desea.

+0

Hay que tener en cuenta que 'KeyValuePair' no es serializable. Una descripción más detallada de la solución aquí se discute en esta pregunta de seguimiento: http://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – Slauma

+0

¿Sería capaz? para proporcionar un ejemplo práctico? –

6

No conozco ninguna clase incorporada para analizar el archivo ini. He usado nini cuando es necesario para hacerlo. Está licenciado bajo la licencia MIT/X11, por lo que no tiene ningún problema para ser incluido en un programa de código cerrado.

Es muy útil. Así que si usted tiene un archivo con formato Settings.ini esta manera:

[Configuration] 
Name = Jb Evain 
Phone = +330101010101 

Su uso podría ser tan simple como:

var source = new IniConfigSource ("Settings.ini"); 
var config = source.Configs ["Configuration"]; 

string name = config.Get ("Name"); 
string phone = config.Get ("Phone"); 
+0

útiles. Aquí está el repo de git (hub) https://github.com/bmatzelle/nini –

0

Formato del archivo de esta manera:

key1=value1 
key2=value2 

Lea la todo el archivo en una cadena (hay una función de conveniencia simple que hace eso, tal vez en el archivo o la clase de cadena), y llame a string.Split ('='). Asegúrese de llamar también a string.Trim() en cada tecla y valor a medida que recorre la lista y meta cada par en una tabla hash o diccionario.

2

si desea que el usuario sea capaz de leer y modificar el archivo, sugiero un par delimitado por comas, uno por línea

key1,value1 
key2,value2 
... 

análisis es simple: leer el archivo, dividida en salto de línea o la coma , luego tome los elementos por parejas

+0

También podría hacerlo equivalente en formato a un archivo de propiedades Java y usar iguales en lugar de coma. – JeeBee

+0

@JeeBee: pero eso supondría que el usuario estaría familiarizado con un formato de archivo de propiedades java; un formato csv se puede editar con Excel o bloc de notas –

5

Si busca una función fácil y rápida y no desea utilizar la aplicación .Net configurando los archivos de configuración del usuario ni le preocupan los problemas de serialización que a veces ocurren en el tiempo.

La siguiente función estática puede cargar un archivo formateado como "KEY = VALUE".

public static Dictionary<String, String> LoadConfig(string settingfile) 
    { 
     var dic = new Dictionary<String, String>(); 

     if (File.Exists(settingfile)) 
     { 
      var settingdata = File.ReadAllLines(settingfile); 
      for (var i = 0; i < settingdata.Length; i++) 
      { 
       var setting = settingdata[i]; 
       var sidx = setting.IndexOf("="); 
       if (sidx >= 0) 
       { 
        var skey = setting.Substring(0, sidx); 
        var svalue = setting.Substring(sidx+1); 
        if (!dic.ContainsKey(skey)) 
        { 
         dic.Add(skey, svalue); 
        } 
       } 
      } 
     } 

     return dic; 
    } 

Nota: Estoy usando un diccionario para las claves deben ser únicas, que suele ser el caso de que con el ajuste.

USO:

var settingfile = AssemblyDirectory + "\\mycustom.setting"; 
    var settingdata = LoadConfig(settingfile); 
    if (settingdata.ContainsKey("lastrundate")) 
    { 
     DateTime lout; 
     String svalue; 
     if (settingdata.TryGetValue("lastrundate", out svalue)) 
     { 
      DateTime.TryParse(svalue, out lout); 
      lastrun = lout; 
     } 
    }