2008-11-12 2 views
7

Для моего проекта требуется файл, в котором я буду хранить данные пары ключ/значение, которые должны быть прочитаны и изменены пользователем. Я хочу, чтобы программа просто ожидала, что ключи будут там, и я хочу как можно быстрее проанализировать их из файла.Простейший возможный разбор пар ключей/значений в .NET.

Я мог бы хранить их в XML, но XML является сложным, и для этого потребуются пересекающиеся узлы, дочерние узлы и т. Д., Все, что я хочу, это некоторый класс, который принимает файл и генерирует пары значений ключа. Я хочу как можно меньше обрабатывать ошибки, и я хочу, чтобы это было сделано с минимальным количеством кода.

Я сам мог бы написать такой класс, но я бы лучше научился тому, как он работает в рамке, чем изобретать колесо дважды. Есть ли какой-нибудь встроенный магический класс в .NET (3.5), который может это сделать?

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

Как @Nicholas Манкузо отметил, XML сериализация не требует перемещения узлов и т.д. – user7116 2008-11-12 18:51:44

ответ

6

Используйте класс KeyValuePair для вас ключ и значение, затем просто сериализуйте List на диск с помощью XMLSerializer.

Это был бы самый простой подход, который я чувствую. Вам не придется беспокоиться о пересечении узлов. Вызов функции Deserialize сделает это для вас. Пользователь может редактировать значения в файле, если они того пожелают.

+0

Нужно учитывать, что `KeyValuePair` не является сериализуемым. Более подробное описание решения здесь обсуждается в этом следующем вопросе: http://stackoverflow.com/questions/2658916/serializing-a-list-of-key-value-pairs-to-xml – Slauma 2010-04-17 16:42:36

+0

Вы могли бы представить практический пример? – 2014-01-06 14:06:26

6

Я не знаю какого-либо встроенного класса для анализа ini-файла. Я использовал nini, когда это необходимо. Он лицензируется по лицензии MIT/X11, поэтому нет никакой проблемы, которая должна быть включена в программу с закрытым исходным кодом.

Это очень полезно. Так что если у вас есть Settings.ini файл отформатирован следующим образом:

[Configuration] 
Name = Jb Evain 
Phone = +330101010101 

Используя это было бы так просто, как:

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

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

Полезно. Вот реплика git (hub) https://github.com/bmatzelle/nini – 2016-11-01 12:40:34

0

формат файла следующим образом:

key1=value1 
key2=value2 

прочитать весь файл в строку (есть простая удобная функция, которая делает это, может быть, в файле или строчном классе) и вызывает string.Split ('='). Убедитесь, что вы также вызываете string.Trim() для каждого ключа и значения при переходе по списку и поместите каждую пару в хэш-таблицу или словарь.

2

, если вы хотите, чтобы пользователь мог читать и изменять файл, я предлагаю пару с разделителем запятой, один за линию

key1,value1 
key2,value2 
... 

разборе прост: прочитать файл, разделить на новой строке или запятой , затем возьмите элементы в парах

5

Если вы ищете быструю простую функцию и не хотите использовать файлы конфигурации .Net app \ user config или беспокоиться о проблемах с сериализацией, которые иногда происходят во времени.

Следующая статическая функция может загружать файл, отформатированный как «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; 
    } 

Примечание: Я использую словарь так ключи должны быть уникальными, которые, как правило, что в случае с установкой.

ПРИМЕНЕНИЕ:

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; 
     } 
    } 
Смежные вопросы