Как вытащить значение из INI-файла?

186
25 июня 2018, 09:30

Есть файл profiles.ini в нём существует строчка, содержащая путь до некоторой папки, например:

Path=Profiles/6tk25599.default

Как мне прочитать файл и добраться до этого значения?

Вот всё содержимое файла:

[General]
StartWithLastProfile=1
[Profile0]
Name=default
IsRelative=1
Path=Profiles/6tk25599.default
Default=1

В итоге я хочу получить путь: Profiles/6tk25599.default

Попробовал такой метод:

foreach (var str in File.ReadLines("profiles.ini").Skip(6).Take(1))
{
   Console.WriteLine(str); // получаю путь:  Path=Profiles/6tk25599.default
}
Answer 1

Вот, что Вам необходимо сделать:

foreach (string x in File.ReadAllLines("profiles.ini"))
{
    string[] data = x.Split('=');
    if (data.Length == 2 && data[0] == "Path")
    {
        Console.WriteLine(data[1]); // Вывод: Profiles/6tk25599.default
        break;
    }
}
  1. Проходимся по всем строчкам из нужного Вам файла
  2. Делим строчку по символу '='
  3. Если "ключ" равняется нужному Вам "Path", то выводим значение в консоль и останавливаем цикл

UPD: Судя по обновлению Вашего вопроса, строка всегда остается на одной позиции. Так что все еще проще:

Console.WriteLine(File.ReadAllLines("profiles.ini")[6].Split('=')[1]);

UPD2: Как заметил @Андрей, лучше использовать метод File.ReadLines, чтобы не хранить в памяти всю коллекцию строк. Так что обновляю ответ


Вариант для извлечения из изначально неизвестной строки:

File.ReadLines("profiles.ini").First(x => x.StartsWith("Path=")).Split('=')[1];


Вариант для извлечения из изначально известной строки:

File.ReadLines("profiles.ini").ElementAt(6).Split('=')[1];
Answer 2

Не уважаете вы ini файлы, да, устарели, но е мое, это тоже ведь придуманный человеком формат, такой же как XML или JSON, в свое время был очень популярным, да что там, даже сейчас часто где еще есть.

Так вот, с файлом надо работать как положено и для этого есть специальные инструменты в самой Windows! Создайте примерно такой класс источник и работайте как положено! :

public class IniFile
{
    public string path;
    [DllImport("kernel32")]
    private static extern long WritePrivateProfileString(string section,
        string key, string val, string filePath);
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string section,
        string key, string def, StringBuilder retVal,
        int size, string filePath);

    public IniFile(string iniPath)
    {
        path = iniPath;
    }
    public void IniWriteValue(string section, string key, string value)
    {
        WritePrivateProfileString(section, key, value, path);
    }
    public string IniReadValue(string section, string key)
    {
        StringBuilder temp = new StringBuilder(255);
        int i = GetPrivateProfileString(section, key, "", temp, 255, path);
        return temp.ToString();
    }
}

Далее нам достаточно написать:

IniFile ini = new IniFile(@"D:\test.ini");
var result = ini.IniReadValue("Profile0", "Path");
Answer 3

Как верно заметил @EvgeniyZ в соседнем ответе, для разбора файлов в специализированных форматах нужно использовать средства предназначенные для этого, т. к. при "ручном" парсинге можно запросто забыть учесть какой-то нюанс.

Я на вашем месте подключил бы какую-нибудь библиотеку и воспользовался ей, например можно использовать ini-parser:

using IniParser;
using System;
class Program
{
    static void Main(string[] args)
    {
        var filepath = @"...\Test.ini";
        var parser = new FileIniDataParser();
        var iniData = parser.ReadFile(filepath);
        var sectionName = "Profile0";
        var keyName = "Path";
        var value = iniData[sectionName][keyName];
        Console.WriteLine(value);
    }
}

Преимущество этого подхода перед использованием WinAPI — отсутствие зависимости от платформы и большее удобство.

READ ALSO
Литература по углублению в MySQL [закрыт]

Литература по углублению в MySQL [закрыт]

Всем приветИщу книгу где можно углубленно почитать про SQL (MySQL) Я уже пишу программку и так же у меня неплохо получается писать запросы

142
Курсор для бд postgres

Курсор для бд postgres

Прошу помощи с написанием курсора на postgresSQL - есть такое задание

194
Структура БД SQLite3: как реализовать?

Структура БД SQLite3: как реализовать?

Нужна очень простая БДВот пример структуры:

167