Чтение INI-файла в C # - PullRequest
3 голосов
/ 12 мая 2010

Я пытаюсь прочитать INI-файл, который имеет следующий формат:

SETTING=VALUE 
SETTING2=VALUE2

В настоящее время у меня есть следующий код:

string cache = sr.ReadToEnd();                    
string[] splitCache = cache.Split(new string[] {"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);

Что дает мне список настроек, однако, что я хотел бы сделать, это прочитать это в словарь. У меня вопрос, есть ли способ сделать это без итерации по всему массиву и вручную заполнить словарь?

Ответы [ 6 ]

7 голосов
/ 12 мая 2010

Ну, вы можете использовать LINQ и сделать

Dictionary<string, string> ini = (from entry in splitCache
                                  let key = entry.Substring(0, entry.FirstIndexOf("="))
                                  let value = entry.Substring(entry.FirstIndexOf("="))
                                  select new { key, value }).ToDictionary(e => e.key, e => e.value);

Как отмечает Binary Worrier в комментариях, этот способ не имеет преимуществ перед простым циклом, предложенным другими ответами.

Редактировать: Более короткая версия вышеприведенного блока будет

Dictionary<string, string> ini = splitCache.ToDictionary(
                                   entry => entry.Substring(0, entry.FirstIndexOf("="),
                                   entry => entry.Substring(entry.FirstIndexOf("="));
6 голосов
/ 12 мая 2010

Что не так с итерацией?

var lines = File.ReadAllLines("pathtoyourfile.ini");
var dict = new Dictionary<string, string>();

foreach(var s in lines)
{
     var split = s.Split("=");
     dict.Add(split[0], split[1]);
}
3 голосов
/ 12 мая 2010

На самом деле есть Windows API для чтения / записи INI-файлов в kernel32.dll; см. эту статью CodeProject для примера.

1 голос
/ 15 января 2011

INI-файлы немного сложнее, поэтому я бы не советовал использовать их самостоятельно. Я написал Nini , которая является библиотекой конфигурации, которая включает очень быстрый анализатор.

Пример файла INI:

; This is a comment
[My Section]
key 1 = value 1
key 2 = value 2

[Pets]
dog = rover
cat = muffy

Тот же код C #:

// Load the file
IniDocument doc = new IniDocument ("test.ini");

// Print the data from the keys
Console.WriteLine ("Key 1: " + doc.Get ("My Section", "key 1"));
Console.WriteLine ("Key 2: " + doc.Get ("Pets", "dog"));

// Create a new section
doc.SetSection ("Movies");

// Set new values in the section
doc.SetKey ("Movies", "horror", "Scream");
doc.SetKey ("Movies", "comedy", "Dumb and Dumber");

// Remove a section or values from a section
doc.RemoveSection ("My Section");
doc.RemoveKey ("Pets", "dog");

// Save the changes
doc.Save("test.ini");
1 голос
/ 12 мая 2010

Попробуйте вот так

[DllImport("kernel32.dll", EntryPoint = "GetPrivateProfileString")]

public static extern int GetPrivateProfileString(string SectionName, string KeyName, string Default, StringBuilder Return_StringBuilder_Name, int Size, string FileName);

и вызовите функцию вот так

GetPrivateProfileString(Section_Name, "SETTING", "0", StringBuilder_Name, 10, "filename.ini");

Значение может быть доступно из StringBuilder_Name.

0 голосов
/ 12 мая 2010

Почему бы не прочитать файл как отдельные строки, а затем зациклить их, разделяя на первые =?

var dict = new Dictionary<string,string>();
foreach (var line in File.ReadAllLines(filename)) {
  var parts = line.Split('=', 2); // Maximum of 2 parts, so '=' in value ignored.
  dict.Add(parts[0], parts[1]);
}

(В .NET 4 замените ReadAllLines на ReadLines, чтобы избежать создания массива, ReadLines возвращает IEnumerable<String> и читает файл лениво.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...