RemObjects имеет библиотеку Delphi Prism ShineOn, в которую входит аналогичный класс файлов INI. Но вам нужно иметь Delphi Prism, чтобы скомпилировать его для .NET из исходного кода, поскольку скомпилированная сборка еще не доступна. code.remobjects.com/p/shineon
Лекс Ли
1
Получил ту же проблему и сделал свою собственную библиотеку для разбора INI-файлов: github.com/rickyah/ini-parser Надеюсь, что это поможет
Создатели .NET Framework хотят, чтобы вы использовали файлы конфигурации на основе XML, а не INI-файлы. Так что нет, встроенного механизма их чтения нет.
Вы можете написать свой собственный обработчик INI, что является трудоемким способом старой школы. Это дает вам больше контроля над реализацией, которую вы можете использовать как для плохой, так и для хорошей. Смотрите, например, класс обработки файлов INI с использованием C #, P / Invoke и Win32 .
Хотя это правда, что XML-файлы конфигурации - это путь, это еще не ответ на вопрос или VLQ только для ссылок.
Дэнни Беккет
6
@aloneguid Я бы сказал, что большой набор доступных функций на самом деле способствовал созданию конфигурационных файлов .NET, в результате чего они стали странными бегемотами с большим количеством волшебства в них. Они стали «кодом в файле конфигурации», и это приводит к большой сложности, странному поведению и усложняет управление конфигурацией. (Я смотрю на вас, «провайдеры» базы данных и строки подключения.) Таким образом, файлы INI, как правило, также лучше подходят для ручного редактирования.
jpmc26
1
Мне нравится старый метод (P / Inovke), и вы можете использовать юникод со старым методом, например: File.WriteAllBytes (path, new byte [] {0xFF, 0xFE});
sailfish009
2
Хороший пакет, но это может быть лучше. Он не может полностью проанализировать значение, которое содержит '=' Or '\ n'
Ахмад Бехжати
211
Предисловие
Во-первых, прочитайте этот пост в блоге MSDN об ограничениях файлов INI . Если это соответствует вашим потребностям, читайте дальше.
Это сжатая реализация, которую я написал, с использованием оригинальной Windows P / Invoke, поэтому она поддерживается всеми версиями Windows с установленным .NET (т.е. Windows 98 - Windows 10). Настоящим я публикую его в открытом доступе - вы можете использовать его в коммерческих целях без указания авторства.
Крошечный класс
Добавьте новый класс IniFile.csдля вашего проекта:
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;// Change this to match your program's normal namespace
namespace MyProg{classIniFile// revision 11{stringPath;string EXE =Assembly.GetExecutingAssembly().GetName().Name;[DllImport("kernel32",CharSet=CharSet.Unicode)]staticexternlongWritePrivateProfileString(stringSection,stringKey,stringValue,stringFilePath);[DllImport("kernel32",CharSet=CharSet.Unicode)]staticexternintGetPrivateProfileString(stringSection,stringKey,stringDefault,StringBuilderRetVal,intSize,stringFilePath);publicIniFile(stringIniPath=null){Path=newFileInfo(IniPath?? EXE +".ini").FullName;}publicstringRead(stringKey,stringSection=null){varRetVal=newStringBuilder(255);GetPrivateProfileString(Section?? EXE,Key,"",RetVal,255,Path);returnRetVal.ToString();}publicvoidWrite(stringKey,stringValue,stringSection=null){WritePrivateProfileString(Section?? EXE,Key,Value,Path);}publicvoidDeleteKey(stringKey,stringSection=null){Write(Key,null,Section?? EXE);}publicvoidDeleteSection(stringSection=null){Write(null,null,Section?? EXE);}publicboolKeyExists(stringKey,stringSection=null){returnRead(Key,Section).Length>0;}}}
Как это использовать
Откройте файл INI одним из 3 следующих способов:
// Creates or loads an INI file in the same directory as your executable// named EXE.ini (where EXE is the name of your executable)varMyIni=newIniFile();// Or specify a specific name in the current dirvarMyIni=newIniFile("Settings.ini");// Or specify a specific name in a specific dirvarMyIni=newIniFile(@"C:\Settings.ini");
Вы можете написать некоторые значения, например, так:
Я немного опоздал, но это не хватает GetSections()метода.
стил
2
Возможно, более традиционным по умолчанию будут файлы .ini для каждого приложения (не для сборки) Path.GetFullPath(IniPath ?? Path.ChangeExtension(Application.ExecutablePath, ".ini")).
Евгений Рябцев
3
Действительно здорово! Положить его на GitHub?
Эмрис Мирооин
2
@ Дэнни Беккет, хорошо сделано. Это почти так же, как то, что я использовал в последние годы .Net. Обновлен со старого кода лет назад.
Дамиан
10
Старый и, насколько я уважаю Рэймонда Чена, многие ограничения в этой статье были ограничениями конкретной библиотеки INI в Windows, а не самого формата INI. Другие, такие как гранулярные разрешения, могут быть легко обойдены через несколько файлов. Официальная , модернизированы библиотека INI будет наиболее приветствовать, даже сегодня.
Автор создал C # класс "Ini", который предоставляет две функции из KERNEL32.dll. Эти функции: WritePrivateProfileStringи GetPrivateProfileString. Вам понадобятся два пространства имен: System.Runtime.InteropServicesи System.Text.
Шаги по использованию класса Ini
В своем определении пространства имен проекта добавьте
using INI;
Создайте INIFile, как это
INIFile ini =newINIFile("C:\\test.ini");
Используйте IniWriteValueдля записи нового значения в определенный ключ в разделе или используйте IniReadValueдля чтения значения ОТ ключа в определенном разделе.
Я использовал этот подход некоторое время, но улучшения безопасности, начиная с Win7, в значительной степени убили это для меня. Вы все еще можете использовать этот подход, но вы будете хранить INI-файл в ProgramData, и ваше приложение будет читать / писать там.
Джесс
Не сохраняйте ini-файлы конфигурации приложения в ProgramData. Они не принадлежат ни Реестру, ни Программным данным. Предполагается, что файлы конфигурации находятся в папках LocalApplicationData.
using System;
using System.IO;
using System.Collections;publicclassIniParser{privateHashtable keyPairs =newHashtable();privateString iniFilePath;privatestructSectionPair{publicStringSection;publicStringKey;}/// <summary>/// Opens the INI file at the given path and enumerates the values in the IniParser./// </summary>/// <param name="iniPath">Full path to INI file.</param>publicIniParser(String iniPath){TextReader iniFile =null;String strLine =null;String currentRoot =null;String[] keyPair =null;
iniFilePath = iniPath;if(File.Exists(iniPath)){try{
iniFile =newStreamReader(iniPath);
strLine = iniFile.ReadLine();while(strLine !=null){
strLine = strLine.Trim().ToUpper();if(strLine !=""){if(strLine.StartsWith("[")&& strLine.EndsWith("]")){
currentRoot = strLine.Substring(1, strLine.Length-2);}else{
keyPair = strLine.Split(newchar[]{'='},2);SectionPair sectionPair;Stringvalue=null;if(currentRoot ==null)
currentRoot ="ROOT";
sectionPair.Section= currentRoot;
sectionPair.Key= keyPair[0];if(keyPair.Length>1)value= keyPair[1];
keyPairs.Add(sectionPair,value);}}
strLine = iniFile.ReadLine();}}catch(Exception ex){throw ex;}finally{if(iniFile !=null)
iniFile.Close();}}elsethrownewFileNotFoundException("Unable to locate "+ iniPath);}/// <summary>/// Returns the value for the given section, key pair./// </summary>/// <param name="sectionName">Section name.</param>/// <param name="settingName">Key name.</param>publicStringGetSetting(String sectionName,String settingName){SectionPair sectionPair;
sectionPair.Section= sectionName.ToUpper();
sectionPair.Key= settingName.ToUpper();return(String)keyPairs[sectionPair];}/// <summary>/// Enumerates all lines for given section./// </summary>/// <param name="sectionName">Section to enum.</param>publicString[]EnumSection(String sectionName){ArrayList tmpArray =newArrayList();foreach(SectionPair pair in keyPairs.Keys){if(pair.Section== sectionName.ToUpper())
tmpArray.Add(pair.Key);}return(String[])tmpArray.ToArray(typeof(String));}/// <summary>/// Adds or replaces a setting to the table to be saved./// </summary>/// <param name="sectionName">Section to add under.</param>/// <param name="settingName">Key name to add.</param>/// <param name="settingValue">Value of key.</param>publicvoidAddSetting(String sectionName,String settingName,String settingValue){SectionPair sectionPair;
sectionPair.Section= sectionName.ToUpper();
sectionPair.Key= settingName.ToUpper();if(keyPairs.ContainsKey(sectionPair))
keyPairs.Remove(sectionPair);
keyPairs.Add(sectionPair, settingValue);}/// <summary>/// Adds or replaces a setting to the table to be saved with a null value./// </summary>/// <param name="sectionName">Section to add under.</param>/// <param name="settingName">Key name to add.</param>publicvoidAddSetting(String sectionName,String settingName){AddSetting(sectionName, settingName,null);}/// <summary>/// Remove a setting./// </summary>/// <param name="sectionName">Section to add under.</param>/// <param name="settingName">Key name to add.</param>publicvoidDeleteSetting(String sectionName,String settingName){SectionPair sectionPair;
sectionPair.Section= sectionName.ToUpper();
sectionPair.Key= settingName.ToUpper();if(keyPairs.ContainsKey(sectionPair))
keyPairs.Remove(sectionPair);}/// <summary>/// Save settings to new file./// </summary>/// <param name="newFilePath">New file path.</param>publicvoidSaveSettings(String newFilePath){ArrayList sections =newArrayList();String tmpValue ="";String strToSave ="";foreach(SectionPair sectionPair in keyPairs.Keys){if(!sections.Contains(sectionPair.Section))
sections.Add(sectionPair.Section);}foreach(String section in sections){
strToSave +=("["+ section +"]\r\n");foreach(SectionPair sectionPair in keyPairs.Keys){if(sectionPair.Section== section){
tmpValue =(String)keyPairs[sectionPair];if(tmpValue !=null)
tmpValue ="="+ tmpValue;
strToSave +=(sectionPair.Key+ tmpValue +"\r\n");}}
strToSave +="\r\n";}try{TextWriter tw =newStreamWriter(newFilePath);
tw.Write(strToSave);
tw.Close();}catch(Exception ex){throw ex;}}/// <summary>/// Save settings back to ini file./// </summary>publicvoidSaveSettings(){SaveSettings(iniFilePath);}}
+1 к смещению выше понижающей. На что вы действительно жалуетесь? Он сказал, что НАЙДЕН. Вы не одобряете его за то, что он не нашел ни одного со стандартными средствами доступа и использованием stringbuilder?
Тормод
1
@Tormod: Жаль, что я не мог понизить комментарий. Это технический форум, когда мы голосуем за решения, а не заведомо позитивные намерения. Если бы решение, опубликованное самим Кнутом, имело недостатки, на это было бы и должно быть указано. Неважно, было ли решение найдено или написано постером.
ya23
7
Я думаю, что вы растягиваете определение "недостаток". Если решение не подчеркивает вашу чувствительность, то просто не голосуйте. Я только что оставил записку о том, что я уже отрицал его отрицательное голосование, чтобы остальные 7 парней, которые проголосовали за мой комментарий, не делали этого сами.
Tormod
21
Код в ответе Джориджа вдохновляет.
К сожалению, это меняет регистр символов клавиш и не обрабатывает комментарии. Поэтому я написал что-то, что должно быть достаточно надежным, чтобы читать (только) очень грязные INI-файлы и позволять извлекать ключи такими, какие они есть.
Он использует LINQ, словарь строк, нечувствительный к регистру, для хранения разделов, ключей и значений и чтения файла за один раз.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;classIniReader{Dictionary<string,Dictionary<string,string>> ini =newDictionary<string,Dictionary<string,string>>(StringComparer.InvariantCultureIgnoreCase);publicIniReader(string file){var txt =File.ReadAllText(file);Dictionary<string,string> currentSection =newDictionary<string,string>(StringComparer.InvariantCultureIgnoreCase);
ini[""]= currentSection;foreach(var line in txt.Split(new[]{"\n"},StringSplitOptions.RemoveEmptyEntries).Where(t =>!string.IsNullOrWhiteSpace(t)).Select(t => t.Trim())){if(line.StartsWith(";"))continue;if(line.StartsWith("[")&& line.EndsWith("]")){
currentSection =newDictionary<string,string>(StringComparer.InvariantCultureIgnoreCase);
ini[line.Substring(1, line.LastIndexOf("]")-1)]= currentSection;continue;}var idx = line.IndexOf("=");if(idx ==-1)
currentSection[line]="";else
currentSection[line.Substring(0, idx)]= line.Substring(idx +1);}}publicstringGetValue(string key){returnGetValue(key,"","");}publicstringGetValue(string key,string section){returnGetValue(key, section,"");}publicstringGetValue(string key,string section,string@default){if(!ini.ContainsKey(section))return@default;if(!ini[section].ContainsKey(key))return@default;return ini[section][key];}publicstring[]GetKeys(string section){if(!ini.ContainsKey(section))returnnewstring[0];return ini[section].Keys.ToArray();}publicstring[]GetSections(){return ini.Keys.Where(t => t !="").ToArray();}}
и спасибо за то, что не поместили это catch (Exception ex) { throw ex; }там
Марк Шультхайс
1
Хорошо! По крайней мере, некоторые изменения необходимы, чтобы работать лучше. Строка 16: ini [""] = currentSection; To: // ini [""] = currentSection; Это должно быть удалено, поскольку каждый раз первый элемент [0] будет пустым сегментом из-за этой инициализации. Строка 36: currentSection [line.Substring (0, idx)] = line.Substring (idx + 1); To: currentSection [line.Substring (0, idx) .Trim ()] = line.Substring (idx + 1) .Trim (); Ключ и значения должны быть обрезаны независимо, а не только на линии Trim. В INI-подобных конфигурационных файлах, которые обычно добавляют пары K-> V, как правило, выравнивают эти равные внутри секций. Спасибо!
LXSoft
Мы были долгое время. Большое спасибо за ваши предложения. Все они имеют смысл и заслуживают этого кода, чтобы иметь хорошее обновление.
Ларри
13
Я хочу представить библиотеку IniParser, которую я полностью создал в c #, поэтому она не содержит зависимостей ни в одной ОС, что делает ее Mono-совместимой. Открытый исходный код с лицензией MIT, так что его можно использовать в любом коде.
Если вам нужен только доступ на чтение, а не доступ на запись, и вы используете Microsoft.Extensions.Confiuration(поставляется по умолчанию в комплекте с ASP.NET Core, но работает и с обычными программами), вы можете использовать пакет NuGet Microsoft.Extensions.Configuration.Iniдля импорта ini-файлов в параметры конфигурации.
Просто чтобы добавить, что вы получите ключи сConfiguration["keyname"]
kofifus
@ Скотт - проблема, с которой я столкнулся, по какой-то причине IIS не распознает ее во время работы приложения. он развернут и там, но не потребляется. HTTP 500.30 возвратился, и журнал приложения IIS сообщает, что «файл конфигурации не найден и не является обязательным».
one.beat.consumer
3
Обычно, когда вы создаете приложения с использованием C # и .NET Framework, вы не будете использовать INI-файлы. Чаще всего параметры хранятся в файле конфигурации на основе XML или в реестре. Однако, если ваше программное обеспечение использует общие настройки с унаследованным приложением, может быть проще использовать его файл конфигурации, чем дублировать информацию в другом месте.
.NET Framework не поддерживает непосредственное использование файлов INI. Тем не менее, вы можете использовать функции Windows API с Platform Invocation Services (P / Invoke) для записи и чтения из файлов. В этой ссылке мы создаем класс, который представляет INI-файлы и использует функции Windows API для управления ими. Пожалуйста, перейдите по следующей ссылке.
Оставайтесь вне реестра! Данные конфигурации приложения не должны сохраняться в реестре.
Диджи
3
Если вам нужен простой читатель без разделов и любых других библиотек, вот простое решение:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Tool{publicclassConfig{Dictionary<string,string> values;publicConfig(string path){
values =File.ReadLines(path).Where(line =>(!String.IsNullOrWhiteSpace(line)&&!line.StartsWith("#"))).Select(line => line.Split(newchar[]{'='},2,0)).ToDictionary(parts => parts[0].Trim(), parts => parts.Length>1?parts[1].Trim():null);}publicstringValue(string name,stringvalue=null){if(values!=null&& values.ContainsKey(name)){return values[name];}returnvalue;}}}
Образец использования:
file =newTool.Config(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)+"\\config.ini");
command = file.Value("command");
action = file.Value("action");stringvalue;//second parameter is default value if no key found with this namevalue= file.Value("debug","true");this.debug =(value.ToLower()=="true"||value=="1");value= file.Value("plain","false");this.plain =(value.ToLower()=="true"||value=="1");
Между тем содержимое файла конфигурации (как вы видите, поддерживает символ # для комментария к строке):
#command to run
command = php
#default script
action = index.php
#debug mode#debug = true#plain text mode#plain = false#icon = favico.ico
PeanutButter.INI - это упакованный Nuget класс для манипулирования INI-файлами. Он поддерживает чтение / запись, включая комментарии - ваши комментарии сохраняются при записи. Похоже, он достаточно популярен, проверен и прост в использовании. Это также абсолютно бесплатно и с открытым исходным кодом.
Отказ от ответственности: я являюсь автором PeanutButter.INI.
Я опоздал, чтобы вступить в партию, но у меня была та же проблема сегодня, и я написал следующую реализацию:
using System.Text.RegularExpressions;staticbool match(thisstring str,string pat,outMatch m)=>(m =Regex.Match(str, pat,RegexOptions.IgnoreCase)).Success;staticvoidMain(){Dictionary<string,Dictionary<string,string>> ini =newDictionary<string,Dictionary<string,string>>();string section ="";foreach(string line inFile.ReadAllLines(.........))// read from file{string ln =(line.Contains('#')? line.Remove(line.IndexOf('#')): line).Trim();if(ln.match(@"^[ \t]*\[(?<sec>[\w\-]+)\]",outMatch m))
section = m.Groups["sec"].ToString();elseif(ln.match(@"^[ \t]*(?<prop>[\w\-]+)\=(?<val>.*)",out m)){if(!ini.ContainsKey(section))
ini[section]=newDictionary<string,string>();
ini[section][m.Groups["prop"].ToString()]= m.Groups["val"].ToString();}}// access the ini file as follows:string content = ini["section"]["property"];}
Следует отметить, что эта реализация не обрабатывает разделы или свойства, которые не найдены. Чтобы достичь этого, вы должны расширить Dictionary<,>класс -class для обработки необнаруженных ключей.
Для сериализации экземпляра Dictionary<string, Dictionary<string, string>>в .ini-file, я использую следующий код:
string targetpath =.........;Dictionary<string,Dictionary<string,string>> ini =........;StringBuilder sb =newStringBuilder();foreach(string section in ini.Keys){
sb.AppendLine($"[{section}]");foreach(string property in ini[section].Keys)
sb.AppendLine($"{property}={ini[section][property]");}File.WriteAllText(targetpath, sb.ToString());
В случае, если это не очевидно при взгляде на верхний уровень библиотеки (это не было очевидно для меня!), Класс IniDcoument и другие находятся в ComLib.IO.
Тим Китинг
2
Для тех, кто ищет этот маршрут, CommonLibrary.NET, похоже, не следует соглашениям .INI. Он использует двоеточие ":" в качестве разделителя вместо знака равенства и не обрабатывает комментарии (начало строки с точки с запятой или знака решетки приведет к сбою синтаксического анализа).
JMMR
2
Вот моя собственная версия с использованием регулярных выражений. В этом коде предполагается, что каждое имя раздела уникально - если, однако, это не так - имеет смысл заменить словарь списком. Эта функция поддерживает комментарии к файлам .ini, начиная с ';' персонаж. Секция начинается нормально [section], а пары ключ-значение также обычно идут как «ключ = значение». То же предположение, что и для разделов - имя ключа уникально.
/// <summary>/// Loads .ini file into dictionary./// </summary>publicstaticDictionary<String,Dictionary<String,String>> loadIni(String file){Dictionary<String,Dictionary<String,String>> d =newDictionary<string,Dictionary<string,string>>();String ini =File.ReadAllText(file);// Remove comments, preserve linefeeds, if end-user needs to count line number.
ini =Regex.Replace(ini,@"^\s*;.*$","",RegexOptions.Multiline);// Pick up all lines from first section to another sectionforeach(Match m inRegex.Matches(ini,"(^|[\r\n])\\[([^\r\n]*)\\][\r\n]+(.*?)(\\[([^\r\n]*)\\][\r\n]+|$)",RegexOptions.Singleline)){String sectionName = m.Groups[2].Value;Dictionary<String,String> lines =newDictionary<String,String>();// Pick up "key = value" kind of syntax.foreach(Match l inRegex.Matches(ini,@"^\s*(.*?)\s*=\s*(.*?)\s*$",RegexOptions.Multiline)){String key = l.Groups[1].Value;Stringvalue= l.Groups[2].Value;// Open up quotation if any.value=Regex.Replace(value,"^\"(.*)\"$","$1");if(!lines.ContainsKey(key))
lines[key]=value;}if(!d.ContainsKey(sectionName))
d[sectionName]= lines;}return d;}
Для меня эта функция не работает: она забывает один раздел из двух. Я пробовал с и без пустых строк до [Раздел].
иксесс
Можете ли вы скопировать пример вашего .ini, который не работает?
TarmoPikaro
-3
Вот мой класс, работает как шарм:
publicstaticclassIniFileManager{[DllImport("kernel32")]privatestaticexternlongWritePrivateProfileString(string section,string key,string val,string filePath);[DllImport("kernel32")]privatestaticexternintGetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);[DllImport("kernel32.dll")]privatestaticexternintGetPrivateProfileSection(string lpAppName,byte[] lpszReturnBuffer,int nSize,string lpFileName);/// <summary>/// Write Data to the INI File/// </summary>/// <PARAM name="Section"></PARAM>/// Section name/// <PARAM name="Key"></PARAM>/// Key Name/// <PARAM name="Value"></PARAM>/// Value NamepublicstaticvoidIniWriteValue(string sPath,stringSection,stringKey,stringValue){WritePrivateProfileString(Section,Key,Value, sPath);}/// <summary>/// Read Data Value From the Ini File/// </summary>/// <PARAM name="Section"></PARAM>/// <PARAM name="Key"></PARAM>/// <PARAM name="Path"></PARAM>/// <returns></returns>publicstaticstringIniReadValue(string sPath,stringSection,stringKey){StringBuilder temp =newStringBuilder(255);int i =GetPrivateProfileString(Section,Key,"", temp,255, sPath);return temp.ToString();}
}
Использование является очевидным, поскольку это статический класс, просто вызовите IniFileManager.IniWriteValue для чтения раздела или IniFileManager.IniReadValue для чтения раздела.
Этот подход уже был показан и объяснен в другом ответе . Что добавляет ваш ответ, который не покрывается этим?
Palec
Помните, что он работает только в том случае, если файл .ini сохраняется в формате UNICODE (16-битный LE). Используйте Notepad ++ для преобразования текста в Unicode, потому что если вы сохраните его в UTF-8, он не будет работать. Также приемлем ANSI, но вы не можете читать акцентированные письма
user2991288
-6
Вы должны читать и записывать данные из файлов XML, так как вы можете сохранить весь объект в XML, а также заполнить объект из сохраненного XML. Лучше легко манипулировать объектами.
Ссылки на внешние ресурсы приветствуются, но, пожалуйста, добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему оно есть. Всегда указывайте наиболее релевантную часть важной ссылки, если целевой сайт недоступен или постоянно недоступен.
davejal
Я полагаю, что названия ссылок очень ясны в отношении ссылок / контекста. Если вам кажется, что этого недостаточно, смело редактируйте его.
Ответы:
Создатели .NET Framework хотят, чтобы вы использовали файлы конфигурации на основе XML, а не INI-файлы. Так что нет, встроенного механизма их чтения нет.
Тем не менее, существуют сторонние решения.
источник
Предисловие
Во-первых, прочитайте этот пост в блоге MSDN об ограничениях файлов INI . Если это соответствует вашим потребностям, читайте дальше.
Это сжатая реализация, которую я написал, с использованием оригинальной Windows P / Invoke, поэтому она поддерживается всеми версиями Windows с установленным .NET (т.е. Windows 98 - Windows 10). Настоящим я публикую его в открытом доступе - вы можете использовать его в коммерческих целях без указания авторства.
Крошечный класс
Добавьте новый класс
IniFile.cs
для вашего проекта:Как это использовать
Откройте файл INI одним из 3 следующих способов:
Вы можете написать некоторые значения, например, так:
Чтобы создать такой файл:
Чтобы прочитать значения из файла INI:
При желании вы можете установить
[Section]
:Чтобы создать такой файл:
Вы также можете проверить наличие ключа следующим образом:
Вы можете удалить ключ следующим образом:
Вы также можете удалить целый раздел (включая все ключи) следующим образом:
Пожалуйста, не стесняйтесь комментировать любые улучшения!
источник
GetSections()
метода.Path.GetFullPath(IniPath ?? Path.ChangeExtension(Application.ExecutablePath, ".ini"))
.Эта статья о CodeProject « Класс обработки файлов INI с использованием C # » должен помочь.
Автор создал C # класс "Ini", который предоставляет две функции из KERNEL32.dll. Эти функции:
WritePrivateProfileString
иGetPrivateProfileString
. Вам понадобятся два пространства имен:System.Runtime.InteropServices
иSystem.Text
.Шаги по использованию класса Ini
В своем определении пространства имен проекта добавьте
Создайте INIFile, как это
Используйте
IniWriteValue
для записи нового значения в определенный ключ в разделе или используйтеIniReadValue
для чтения значения ОТ ключа в определенном разделе.Примечание: если вы начинаете с нуля, вы можете прочитать эту статью MSDN : Как добавить файлы конфигурации приложения в проекты C # . Это лучший способ для настройки вашего приложения.
источник
Я нашел эту простую реализацию:
http://bytes.com/topic/net/insights/797169-reading-parsing-ini-file-c
Хорошо работает для того, что мне нужно.
Вот как вы используете это:
Вот код:
источник
Код в ответе Джориджа вдохновляет.
К сожалению, это меняет регистр символов клавиш и не обрабатывает комментарии. Поэтому я написал что-то, что должно быть достаточно надежным, чтобы читать (только) очень грязные INI-файлы и позволять извлекать ключи такими, какие они есть.
Он использует LINQ, словарь строк, нечувствительный к регистру, для хранения разделов, ключей и значений и чтения файла за один раз.
источник
catch (Exception ex) { throw ex; }
тамЯ хочу представить библиотеку IniParser, которую я полностью создал в c #, поэтому она не содержит зависимостей ни в одной ОС, что делает ее Mono-совместимой. Открытый исходный код с лицензией MIT, так что его можно использовать в любом коде.
Вы можете проверить исходный код в GitHub , и он также доступен в виде пакета NuGet
Он сильно настраивается и действительно прост в использовании .
Извините за бесстыдный плагин, но я надеюсь, что он может помочь любому, кто вернется к этому ответу.
источник
Если вам нужен только доступ на чтение, а не доступ на запись, и вы используете
Microsoft.Extensions.Confiuration
(поставляется по умолчанию в комплекте с ASP.NET Core, но работает и с обычными программами), вы можете использовать пакет NuGetMicrosoft.Extensions.Configuration.Ini
для импорта ini-файлов в параметры конфигурации.источник
Configuration["keyname"]
Обычно, когда вы создаете приложения с использованием C # и .NET Framework, вы не будете использовать INI-файлы. Чаще всего параметры хранятся в файле конфигурации на основе XML или в реестре. Однако, если ваше программное обеспечение использует общие настройки с унаследованным приложением, может быть проще использовать его файл конфигурации, чем дублировать информацию в другом месте.
.NET Framework не поддерживает непосредственное использование файлов INI. Тем не менее, вы можете использовать функции Windows API с Platform Invocation Services (P / Invoke) для записи и чтения из файлов. В этой ссылке мы создаем класс, который представляет INI-файлы и использует функции Windows API для управления ими. Пожалуйста, перейдите по следующей ссылке.
Чтение и запись файлов INI
источник
Если вам нужен простой читатель без разделов и любых других библиотек, вот простое решение:
Образец использования:
Между тем содержимое файла конфигурации (как вы видите, поддерживает символ # для комментария к строке):
источник
Попробуйте этот метод:
Создает словарь, в котором ключ «-». Вы можете загрузить его так:
источник
PeanutButter.INI - это упакованный Nuget класс для манипулирования INI-файлами. Он поддерживает чтение / запись, включая комментарии - ваши комментарии сохраняются при записи. Похоже, он достаточно популярен, проверен и прост в использовании. Это также абсолютно бесплатно и с открытым исходным кодом.
Отказ от ответственности: я являюсь автором PeanutButter.INI.
источник
Я опоздал, чтобы вступить в партию, но у меня была та же проблема сегодня, и я написал следующую реализацию:
Следует отметить, что эта реализация не обрабатывает разделы или свойства, которые не найдены. Чтобы достичь этого, вы должны расширить
Dictionary<,>
класс -class для обработки необнаруженных ключей.Для сериализации экземпляра
Dictionary<string, Dictionary<string, string>>
в.ini
-file, я использую следующий код:источник
В CommonLibrary.NET доступен анализатор Ini
Это имеет различные очень удобные перегрузки для получения секций / значений и очень легкий вес.
источник
Вот моя собственная версия с использованием регулярных выражений. В этом коде предполагается, что каждое имя раздела уникально - если, однако, это не так - имеет смысл заменить словарь списком. Эта функция поддерживает комментарии к файлам .ini, начиная с ';' персонаж. Секция начинается нормально [section], а пары ключ-значение также обычно идут как «ключ = значение». То же предположение, что и для разделов - имя ключа уникально.
источник
Вот мой класс, работает как шарм:
}
Использование является очевидным, поскольку это статический класс, просто вызовите IniFileManager.IniWriteValue для чтения раздела или IniFileManager.IniReadValue для чтения раздела.
источник
Вы должны читать и записывать данные из файлов XML, так как вы можете сохранить весь объект в XML, а также заполнить объект из сохраненного XML. Лучше легко манипулировать объектами.
Вот как это сделать: Записать объектные данные в файл XML: https://msdn.microsoft.com/en-us/library/ms172873.aspx Считать объектные данные из файла XML: https://msdn.microsoft. ком / EN-US / библиотека / ms172872.aspx
источник