Страницы

Поиск по вопросам

среда, 29 января 2020 г.

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

#c_sharp #ini


Есть файл 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
}

    


Ответы

Ответ 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; } } Проходимся по всем строчкам из нужного Вам файла Делим строчку по символу '=' Если "ключ" равняется нужному Вам "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];

Ответ 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");

Ответ 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 — отсутствие зависимости от платформы и большее удобство.

Комментариев нет:

Отправить комментарий