INI файл - Википедия - INI file

Инициализация
INI-файл icon.png
Расширение имени файла
.ini
Тип интернет-СМИ
текст / простой, приложение / textedit, zz-приложение / zz-winassoc-ini
Тип форматаФайл инициализации / конфигурации

An INI файл это конфигурационный файл за компьютерное программное обеспечение который состоит из текстового контента со структурой и синтаксисом, включающими пары ключ-значение для свойств и разделов, которые организуют свойства.[1] Название этих файлов конфигурации происходит от расширение имени файла INI, за инициализация, используемый в MS-DOS операционная система, популяризировавшая этот метод настройки программного обеспечения. Формат стал неформальным стандартом во многих контекстах конфигурации, но многие приложения в других операционных системах используют другие расширения имен файлов, такие как conf и cfg.[2]

История

Первичный механизм настройки программного обеспечения в Windows изначально был форматом текстового файла, который состоял из текстовых строк с одной парой ключ-значение на строку, организованных в разделы. Этот формат использовался для компонентов операционной системы, таких как драйверы устройств, шрифты, средства запуска. Файлы INI также обычно использовались приложениями для хранения индивидуальных настроек.[3]

Формат был 16-битным. Майкрософт Виндоус платформы через Windows 3.1x. Начиная с Windows 95 Microsoft одобрила использование Реестр Windows и начал уводить разработчиков от использования файлов INI для настройки. Все последующие версии Windows использовали реестр Windows для настройки системы, но приложения, построенные на .NET Framework, используют специальные XML .config файлы. Функции файла инициализации по-прежнему доступны в Windows, и разработчики по-прежнему могут их использовать.

Linux и Unix системы также используют аналогичный формат файла для конфигурации системы. Кроме того, программное обеспечение, не зависящее от платформы, может использовать этот формат файла для конфигурации. это человек читаемый и простой для синтаксического анализа, поэтому это удобный формат для файлов конфигурации, которые не требуют гораздо большей сложности.

Файлы конфигурации Git похожи на файлы INI.[4]

Например, платформенно-независимый PHP использует формат INI для своего "php.ini"файл конфигурации в системах Windows и Linux.[5][6]

Desktop.ini Файлы определяют отображение каталогов в Windows, например, значки для каталога.[7]

Формат

Ключи (свойства)

Базовый элемент, содержащийся в файле INI, - это ключ или же свойство. У каждого ключа есть имя и значение, ограниченный по знак равенства знак равно Имя отображается слева от знака равенства. В реализации Windows знак равенства и точка с запятой являются зарезервированными символами и не могут появляться в ключе. Значение может содержать любой символ.

имя=ценить

Разделы

Ключи могут, но не обязательно, быть сгруппированы в произвольно названные разделы. Название раздела появляется в отдельной строке в квадратных скобках ([ и ]). Все ключи после объявления раздела связаны с этим разделом. Нет явного разделителя «конец раздела»; разделы заканчиваются объявлением следующего раздела или в конце файла. Разделы не могут быть вложенными.

[раздел]а=аб=б

Чувствительность к регистру

Имена разделов и свойств не чувствительный к регистру в реализации Windows,[8] но другие приложения могут вести себя иначе.

Комментарии

Точка с запятой (;) в начале строки указывают комментарий. Строки комментариев игнорируются.

; текст комментария

Различные функции

Формат файла INI не всегда строго определен. Много компьютерные программы функции поддержки, выходящие за рамки уже описанных. Ниже приводится список некоторых общих функций, которые могут или не могут быть реализовано в любой данной программе.

Комментарии

Некоторое программное обеспечение поддерживает использование числовой знак (#) вместо точки с запятой для обозначения комментариев. Однако он может быть включен в название ключа. Например, следующая строка создает переменную с именем «#var», но не переменную с именем «var»; иногда это используется для создания псевдо-реализации комментария.

# var = a

В целом, использование знака числа непредсказуемо, как в следующих строках (обратите внимание на пробел после знака числа во второй строке). По этой причине не следует использовать знак числа в начале комментария.

#[раздел]# var = a

В некоторых реализациях комментарий может начинаться в любом месте строки, в том числе в той же строке после объявлений свойств или разделов. В других, включая WinAPI функция GetPrivateProfileString, комментарии должны размещаться в отдельных строках.

Повторяющиеся имена

Большинство реализаций поддерживают только одно свойство с заданным именем в разделе. Второе вхождение имени свойства может вызвать прервать, он может быть проигнорирован (и значение отброшено), или он может заменить первое вхождение (с отбрасыванием первого значения). Некоторые программы используют повторяющиеся имена свойств для реализации многозначных свойств.

Интерпретация нескольких объявлений разделов с одним и тем же именем также различается. В некоторых реализациях повторяющиеся разделы просто объединяют свои свойства, как если бы они располагались непрерывно. Другие могут прервать или проигнорировать некоторые аспекты INI-файла.

Побег персонажей

Некоторые реализации также предлагают различную поддержку escape-символ, как правило, с обратная косая черта (\). Некоторые поддерживают «продолжение строки», где обратная косая черта, за которой сразу следует EOL (конец строки), приводит к игнорированию разрыва строки и продолжению «логической строки» на следующей фактической строке из INI-файла. Также наблюдается реализация различных «специальных символов» с escape-последовательностями.

Общие escape-последовательности
ПоследовательностьСмысл
\\ (один обратная косая черта, экранирование escape-символа)
\'Апостроф
\"Двойные кавычки
\0Нулевой символ
аЗвонок / Предупреждение / Звуковой
bBackspace, Белл характер для некоторых приложений
тСимвол табуляции
рВозврат каретки
пПеревод строки
\;Точка с запятой
\#Знак числа
\=Знак равенства
\:Двоеточие
Икс????Unicode персонаж с шестнадцатеричный кодовая точка соответствующий ????

Глобальные свойства

Также могут быть разрешены необязательные «глобальные» свойства, которые объявляются до объявления любого раздела.[9]

Иерархия

Чаще всего в файлах INI отсутствует иерархия разделов внутри разделов. Однако некоторые файлы имеют иерархическое соглашение об именах. Для раздела A, подраздела B, подраздела C, свойства P и значения V они могут принимать такие записи, как [A.B.C] и P = V (Windows ' xstart.ini), [A B C] и P = V (файл драйвера IBM Windows devlist.ini), или же [A] и B, C, P = V (Файл Microsoft Visual Studio AEMANAGR.INI).

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

Разделитель имени / значения

Некоторые реализации допускают двоеточие (:) в качестве разделителя имени / значения (вместо знака равенства).

Котировки стоимости

Некоторые реализации позволяют указывать значения, обычно используя двойные кавычки и / или апострофы. Это позволяет явно указывать пробелы и / или заключать в кавычки специальные символы (равно, точка с запятой и т. Д.). Стандартная функция Windows GetPrivateProfileString поддерживает это и удаляет кавычки, окружающие значения.

Пробел

Толкование пробел меняется. Большинство реализаций игнорируют начальные и конечные пробелы вокруг имени свойства. Некоторые даже игнорируют пробелы в значениях (например, делая эквивалентными «имя хоста» и «имя хоста»). Некоторые реализации также игнорируют начальные и конечные пробелы вокруг значения свойства; другие считают все символы после знака равенства (включая пробелы), чтобы быть частью значения.

Порядок разделов и свойств

В большинстве случаев порядок свойств в разделе и порядок разделов в файле не имеют значения, но реализации могут отличаться.

Пример

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

; последнее изменение: 1 апреля 2001 г., автор: John Doe[владелец]имя=Джон Доуорганизация=Acme Widgets Inc.[база данных]; использовать IP-адрес в случае, если разрешение сетевого имени не работаетсервер=192.0.2.62     порт=143файл="payroll.dat"

Доступ к файлам INI

Под Windows API профиля - это программный интерфейс, используемый для чтения и записи настроек из классических файлов Windows .ini. Например, GetPrivateProfileString функция извлекает строку из указанного раздела в файле инициализации.

Следующий образец C программа демонстрирует чтение значений свойств из приведенного выше примера INI-файла (пусть имя файла конфигурации будет dbsettings.ini):

#включают <windows.h>int главный(int argc, _TCHAR *argv[]){  _TCHAR dbserver[1000];  int dbport;  GetPrivateProfileString("база данных", "сервер", "127.0.0.1", dbserver, размер(dbserver) / размер(dbserver[0]), ".\\dbsettings.ini ");  dbport = GetPrivateProfileInt("база данных", "порт", 143, ".\\dbsettings.ini ");  // N.B. WritePrivateProfileInt () не существует  возвращаться 0;}

Третий параметр функции GetPrivateProfileString - это значение по умолчанию, которое равно «127.0.0.1» и 143 соответственно в двух вызовах функций выше. Если аргумент, предоставленный для этого параметра, - ПУСТО (NULL), по умолчанию используется пустая строка "".

В Unix существует множество различных библиотек конфигурации для доступа к файлам INI. Часто они уже включены в структуры и наборы инструментов. Примеры синтаксических анализаторов INI для Unix включают: GLib, анализатор и libconfini.

Сравнение парсеров INI

ИмяПоддержка разделовПоддержка вложения разделовРаспознавание отключенной записи[10]Многострочная поддержка[11]Типы значенийПоддержка чтения / записиПлатформаЛицензияЯзык программированияПоследняя версия выпуска
ConfigParser[12][13]даНетНетНестандартный[14]Булево, Число, НитьЧитать + писать* BSD, GNU / Linux, macOS, WindowsPSFLC (выполнение), Python (использование)3.8.2[15]
GLib[16]дадаНетНетБулево, Число, Нить, МножествоЧитать + писать* BSD, GNU / Linux, macOS, WindowsLGPLC2.64.4 (2 июля 2020 г.; 5 месяцев назад (2020-07-02)) [±][17]

[18]

начальный[19]даНетНетНетБулево, Число, НитьЧитать + писать* BSD, GNU / Linux, macOS, WindowsApacheИдти1.2.0[20]
inih[21]даНетНетНестандартный[22]Булево, Число, НитьЧитать* BSD, GNU / Linux, macOS, WindowsBSDC48[23]
анализатор[24]даНетНетдаБулево, Число, НитьЧитать + писать* BSD, GNU / Linux, macOS, WindowsМассачусетский технологический институтC4.1[25]
Ява (через java.util.Properties)[26]НетНетНетдаНитьЧитать + писатьНезависимость от платформыДвойная лицензия: GPL версия 2 с исключением пути к классам,[27] и проприетарный лицензия.[28]C (выполнение), Ява (использование)15.0.1 (20 октября 2020 г.; 49 дней назад (2020-10-20)[29]) [±]

11.0.9.1 (4 ноября 2020 г.; 34 дней назад (2020-11-04)[30]) [±]
8u275 (4 ноября 2020 г.; 34 дней назад (2020-11-04)[31]) [±]

libconfini[32]дадададаБулево, Число, Нить, МножествоЧитать* BSD, GNU / Linux, macOS, WindowsGPLC1.14.0[33]
PyINI[34]даНетдадаБулево, Число, НитьЧитать + писатьНезависимость от платформыGPLPython1.0[35]
RudeConfig[36]даНетНетНетБулево, Число, НитьЧитать + писатьGNU / Linux, WindowsGPLC ++Снято с производства - последняя версия 5.0.5, с ноября 2009 г.[37]
Windows APIдаНетНетНетЧисло, Нить, StructЧтение + запись (неразрушающий)WindowsПроприетарныйC1803 г. (10.0.17134.112) (12 июня 2020 г.); 18 лет назад (20202-06-12)[38]) [±]
Вино (реализация Windows API )даНетНетНетЧисло, Нить, StructЧтение + запись (неразрушающий)Linux, macOS, WindowsLGPLC5.0.3[39] (10 ноября 2020 г.; 28 дней назад (2020-11-10)) [±]
ИмяПоддержка разделовПоддержка вложения разделовРаспознавание отключенной записиМногострочная поддержкаТипы значенийПоддержка чтения / записиПлатформаЛицензияЯзык программированияПоследняя версия выпуска

Сопоставление файлов

Сопоставление файла инициализации создает сопоставление между файлом INI и Реестр.[40][41] Он был представлен в Windows NT и Windows 95 как способ перехода от хранения настроек в классических файлах .ini к новым. Реестр Windows. Сопоставление файлов перехватывает вызовы Profile API и, используя настройки из IniFileMapping Раздел реестра, направляет чтение и запись в соответствующие места в реестре.

Используя приведенный выше пример, можно сделать строковый вызов для получения имя ключ от владелец раздел из файла настроек, который называется, скажем, dbsettings.ini. Возвращаемое значение должно быть строкой «Джон Доу»:

GetPrivateProfileString ("владелец", "имя", ..., "c:  programs  oldprogram  dbsettings.ini");

Отображение INI принимает этот вызов API профиля, игнорирует любой путь в заданном имени файла и проверяет, есть ли в каталоге ключ реестра, соответствующий имени файла:

HKEY_LOCAL_MACHINE Программное обеспечение Microsoft Windows NT
CurrentVersion IniFileMapping

Если он существует, он ищет имя записи, соответствующее запрошенному разделу. Если запись найдена, отображение INI использует ее значение как указатель на другую часть реестра. Затем он ищет запрошенную настройку INI в этой части реестра.

Если совпадающее имя записи не найдено и есть запись под (Дефолт) имя записи, вместо него используется сопоставление INI. Таким образом, каждое имя раздела не требует отдельной записи.

HKEY_LOCAL_MACHINE Программное обеспечение ... IniFileMapping dbsettings.ini
(Дефолт)@USR: Программное обеспечение oldprogs inisettings all
база данныхUSR: Программное обеспечение oldprogs inisettings db

Итак, в этом случае вызов профиля для раздела [владелец] отображается на:

HKEY_CURRENT_USER Программное обеспечение oldprogs inisettings все
имяДжон Доу
организацияПродукты Acme

где "имя«Обнаружено, что имя записи реестра соответствует запрошенному ключу INI. Затем значение« John Doe »возвращается в вызов профиля. В этом случае префикс @ по умолчанию предотвращает любое чтение из файла dbsettings.ini на В результате любые настройки, не найденные в реестре, не ищутся в INI-файле.

"база данных"Запись реестра не имеет префикса @ в значении; таким образом, для раздела [база данных] Только, сначала берутся настройки из реестра, а затем из файла dbsettings.ini на диске.

Альтернативы

Начиная с Windows 95, Microsoft начала активно продвигать использование реестра Windows вместо файла INI.[42] Файлы INI обычно ограничены двумя уровнями (разделы и свойства) и плохо обрабатывают двоичные данные. Это решение, однако, не было защищено от критики из-за того, что реестр является монолитным, непрозрачным и двоичным, должен быть синхронизирован с файловой системой и представляет собой единую точку отказа для операционной системы.[43]

Потом XML файлы конфигурации на основе стали популярным выбором для кодирования конфигурации в текстовых файлах.[нужна цитата ] XML допускает произвольно сложные уровни и вложения и имеет стандартные механизмы кодирования. двоичные данные.

В последнее время, сериализация данных форматы, такие как JSON, TOML, и YAML могут служить форматами конфигурации. Эти три альтернативных формата могут размещаться произвольно, но имеют другой синтаксис, чем файл INI. Среди них TOML больше всего напоминает INI, но идея сделать TOML сознательно совместимым с большим подмножеством INI была отклонена.[44]

Однако новейшие синтаксические анализаторы INI допускают такой же произвольный уровень вложенности XML, JSON, TOML, и YAML, предложить эквивалентную поддержку типизированные значения и Unicode, хотя сохраняют «неформальный статус» файлов INI, позволяя использовать несколько синтаксисов для выражения одного и того же.[45]

Смотрите также

Рекомендации

  1. ^ Microsoft TechNet: настройка элемента файла Ini
  2. ^ .conf файлы инициализации
  3. ^ Microsoft: комплект ресурсов для рабочих станций Windows NT
  4. ^ git-config КОНФИГУРАЦИОННЫЙ ФАЙЛ [1]
  5. ^ Расмус Лердорф, Кевин Татро, Питер Макинтайр.«Программирование PHP». Разделы "parse_ini_file", "Расширения INI Entries" и т. Д.
  6. ^ Кристиан Венц."Разговорник PHP и MySQL".section «Анализ файлов INI» .quote: «... формат файла INI ... очень широко использовался в мире Windows, но сегодня также управляет конфигурацией программных продуктов, таких как PHP. Например, ... php.ini"
  7. ^ Кодрут Неагу, «Почему на моем рабочем столе два файла Desktop.ini и что они делают?».
  8. ^ "Функция GetPrivateProfileString". Сеть разработчиков Microsoft. Microsoft. Получено 2012-06-02.
  9. ^ Документация Apache для org.apache.commons.configuration2.INIConfiguration, Фонд программного обеспечения Apache
  10. ^ Среди авторов INI-файлов распространена практика «комментировать» нежелательные записи, чтобы отключить их, вместо того, чтобы удалять их полностью. Увидеть ключ а в следующем примере:
    [раздел]
    # а = а
    б = б
  11. ^ Стандартный синтаксис для продолжения строки здесь относится к последовательности обратная косая черта с последующим Разрыв строки, как реализовано анализатор, libconfini и java.util.Properties
  12. ^ Фредрик Лунд.«Стандартная библиотека Python».2001. Раздел «Модуль ConfigParser» .стр. 143
  13. ^ «ConfigParser - парсер файла конфигурации».
  14. ^ Следуя синтаксису языка, он предназначен для работы с (Python ), чтобы охватить узел на несколько строк, ConfigParser требует более глубокого отступ в следующих строках вместо более распространенных обратная косая черта + Разрыв строки (видеть: configparser - Парсер файла конфигурации )
  15. ^ Документация Python по версии
  16. ^ Парсер файла с ключом-значением GLib
  17. ^ Витналл, Филип (2 июля 2020 г.). "glib 2.64.4". Ftp-релиз GNOME (Список рассылки). Получено 14 августа 2020.
  18. ^ Выпуски · GNOME / glib
  19. ^ начальная документация
  20. ^ Релизы · inifile
  21. ^ inih README
  22. ^ Используя отступы, явно следуя подходу ConfigParser (дополнительную информацию см. В документации проекта)
  23. ^ Релизы · benhoyt / inih
  24. ^ документация iniparser
  25. ^ Релизы · ndevilla / iniparser
  26. ^ Свойства (Java Platform SE 8)
  27. ^ "OpenJDK: GPLv2 + исключение пути к классам". Openjdk.java.net. 1989-04-01. Получено 2016-02-09.
  28. ^ «BCL для Java SE». Oracle.com. 2013-04-02. Получено 2016-02-09.
  29. ^ «Обновления OpenJDK 15». Корпорация Oracle. Получено 2020-09-15.
  30. ^ «Обновления OpenJDK 11». Корпорация Oracle. Получено 2020-11-08.
  31. ^ «Обновления OpenJDK 8». Корпорация Oracle. Получено 2020-11-08.
  32. ^ документация libconfini
  33. ^ Релизы · madmurphy / libconfini
  34. ^ PyINI
  35. ^ Теги · whoatemybutter / PyINI
  36. ^ Документация RudeConfig
  37. ^ Релизы · RudeConfig
  38. ^ «12 июня 2018 г. - KB4284835 (сборка ОС 17134.112)». Служба поддержки Microsoft. Microsoft.
  39. ^ "Выпущено Wine 5.0.3". 10 ноября 2020 г.. Получено 11 ноября 2020.
  40. ^ Файлы инициализации и реестр, Комплект ресурсов для рабочих станций Windows NT, Microsoft TechNet
  41. ^ Администрирование реестра NT, Управление реестром Windows NT, Поль Робишо, O'Reilly Media
  42. ^ Системный реестр
  43. ^ Был ли реестр Windows хорошей идеей? - Кодирование ужасов
  44. ^ «Прокомментировать» совместимость .INI - достойная цель «проблема на GitHub».
  45. ^ libconfini / README

внешняя ссылка