Расширение имени файла | .ini |
---|---|
Тип интернет-СМИ | текст/обычный, приложение/textedit, zz-application/zz-winassoc-ini |
Тип формата | Файл инициализации/конфигурации |
Файл INI — это файл конфигурации для программного обеспечения компьютера , который состоит из простого текста со структурой и синтаксисом, включающим пары ключ-значение, организованные в разделы. [1] Название этих файлов конфигурации происходит от расширения имени файла INI , сокращения от initialization , используемого в операционной системе MS-DOS, которая популяризировала этот метод конфигурации программного обеспечения. Формат стал неформальным стандартом во многих контекстах конфигурации, но многие приложения в других операционных системах используют другие расширения имен файлов, такие как conf и cfg . [2]
Первичным механизмом конфигурации программного обеспечения в Windows изначально был формат текстового файла, который включал текстовые строки с одной парой ключ-значение на строку, организованные в разделы. Этот формат использовался для компонентов операционной системы, таких как драйверы устройств, шрифты и средства запуска. Файлы INI также обычно использовались приложениями для хранения индивидуальных настроек. [3]
Формат поддерживался в 16-разрядных платформах Microsoft Windows вплоть до Windows 3.1x . Начиная с Windows 95, Microsoft отдавала предпочтение использованию реестра Windows и начала отучать разработчиков от использования файлов INI для конфигурации. Все последующие версии Windows использовали реестр Windows для конфигурации системы, но приложения, созданные на основе .NET Framework, используют специальные файлы XML .config . Функции файла инициализации по-прежнему доступны в Windows, и разработчики могут по-прежнему их использовать.
Помимо программного обеспечения Windows, платформенно-независимое программное обеспечение может использовать этот формат файла для конфигурации. Некоторые файлы конфигурации Unix также используют похожий формат. INI удобен для чтения человеком и прост в анализе, поэтому это удобный формат для файлов конфигурации, которые не требуют гораздо большей сложности.
Ниже приведен неполный список мест, где встречаются INI-файлы.
Desktop.ini
Файлы по-прежнему используются в Windows для настройки свойств каталогов, например, для указания значка папки. [4] [5]php.ini
использует формат INI. [6] [7].git/config
написан в формате INI. [8]*.desktop
написаны в формате INI. [9]*.service
записываются в INI. [10]afp.conf
написан на языке конфигурации в стиле INI. [11]pacman.conf
написан в INI. [12]В следующем примере файла есть два раздела: один для владельца программного обеспечения и один для подключения к базе данных заработной платы. Комментарии фиксируют последнего человека, который изменил файл, и причину изменения.
; последнее изменение 1 апреля 2001 г. от John Doe [владелец] имя = John Doe организация = Acme Widgets Inc. [база данных] ; использовать IP-адрес в случае, если разрешение сетевых имен не работает сервер = 192.0.2.62 порт = 143 файл = "payroll.dat"
В более широком смысле INI — это неформальный формат, который хорошо подходит для реализации ad hoc, оставаясь при этом настраиваемым человеком. Следовательно, существует множество различных спецификаций (где иногда реализация парсера является единственной когда-либо написанной спецификацией), называемых диалектами INI .
Интерпретации INI во многом зависят от личных предпочтений и потребностей вычислительной среды, таких как сохранение пробелов, информация о типе поля, чувствительность к регистру или предпочтительные разделители комментариев. Это делает INI склонным к распространению. Тем не менее, реализации на основе INI обычно имеют общие черты дизайна: текстовый файл, состоящий из пары ключ-значение на каждой строке, разделенной знаком равенства , организованный в разделы, обозначенные квадратными скобками.
Существуют попытки создать синтаксические анализаторы, способные поддерживать как можно больше диалектов, [13] и в своей самой сложной интерпретации формат INI способен выражать произвольные S-выражения , что делает его эквивалентным стандартизированным форматам, таким как XML или JSON , хотя и с синтаксисом, который не является раз и навсегда установленным и для некоторых может показаться более удобным.
Поскольку формат файла INI не определен жестко, многие парсеры поддерживают функции, выходящие за рамки тех, которые формируют общее ядро. Реализованная поддержка весьма изменчива.
Данные в INI хранятся в парах ключ-значение, называемых key или property . Таким образом, key может ссылаться либо на всю пару ключ-значение, либо только на ее key. Значение также называется property name . В текстовом представлении пара ключ-значение представлена либо строкой, либо многострочной, где начало значения обозначается разделителем , чаще всего знаком равенства ( =
, ASCII 0x3D), но иногда также двоеточием ( :
, ASCII 0x3A) или пробелом (иногда используется в мире GNU [13] ). Key ключа отображается слева от разделителя, часто не является пустым и не должен содержать разделитель. Некоторые разновидности допускают escape-последовательности в значении.
В реализации Windows знак равенства и точка с запятой являются зарезервированными символами и не могут появляться в ключе. Любые пробелы вокруг ключа удаляются анализатором. Значение может содержать любой символ (в стиле Windows вокруг разделителя нет пробелов: например IconFile=Folder.ico
).
Пары ключ-значение могут текстуально выглядеть так:
ключ = ключ=v имя = значение sem = ; semver = v5822.433.2
Пары ключ-значение могут быть сгруппированы в разделе . Некоторые диалекты INI требуют, чтобы каждая пара ключ-значение находилась в разделе, некоторые допускают так называемые глобальные свойства . [14] Когда пары ключ-значение группируются, имя раздела отображается на отдельной строке, заключенное в квадратные скобки ( [
, ASCII 0x5B и ]
, ASCII 0x5D), и применяется ко всем парам ключ-значение в последующих строках, пока не будет объявлен другой раздел. Явного разделителя «конец раздела» (например, как в XML ) нет </tag>
. Таким образом, разделы синтаксически не могут быть произвольно вложенными. При необходимости вложенность может быть реализована путем выравнивания иерархии и объединения с пользовательским символом-разделителем внутри имени раздела (часто .
, ASCII 0x2E). Часто поддерживается один уровень вложенности, называемый подразделами .
Пример документа INI, использующего вложенные разделы:
[проект] название = служба аренды сада (с приложением) целевой регион = "Bay Area" ; TODO: объявить вакансии юридическая группа = (вакансия) [фрукт "Яблоко"] вопросы товарного знака = предсказуемый вкус = известный [фрукт.Дата] вкус = новый Проблемы с товарным знаком = "действительно маловероятно" [фрукт "Малина"] ожидаемые проблемы = "логистика (хрупкий фрукт)" Проблемы с товарным знаком = \ возможны [fruit.raspberry.proponents.fred] date = 2021-11-23, 08:54 +0900 comment = "Мне нравятся красные фрукты." [fruit "Date/proponents/alfred"] comment : Почему, \ \ \ Я бы купил финики. # сворачивание: "\\\\\nn" интерпретируется как "\\n" или "\n"? # Или "\\\\" предотвращает сворачивание? editor = Мое имя может содержать \ \ новую строку.
Некоторые парсеры допускают вложение разделов, используя точки в качестве разделителей пути:
[раздел] домен = example.com [раздел.подраздел] foo = bar
В некоторых случаях поддерживается также относительная вложенность, где начальная точка обозначает вложенность в предыдущий раздел: [13]
[раздел] домен = example.com [.subsection] foo = бар
Исторически существовали также альтернативные точке способы выражения вложенности (например, файл драйвера IBM для Microsoft Windows devlist.ini
, в котором обратная косая черта использовалась как разделитель вложенности в форме [A\B\C]
; или файл Microsoft Visual Studio AEMANAGR.INI
, в котором использовался совершенно другой синтаксис в форме [A]
и B,C,P = V
). Некоторые парсеры вообще не предлагали поддержки вложенности и были слепы к иерархии, но вложенность все еще могла частично эмулироваться путем использования того факта, что [A.B.C]
представляет собой уникальный идентификатор.
Имена разделов и свойств в Windows нечувствительны к регистру . [15] Большинство интерпретаций INI в стиле Unix вообще запрещают преобразование регистра, хотя преобразование регистра для имени раздела [16] или ключа [17] иногда допускается.
Строка с непрерывным конечным пробелом, за которым следует точка с запятой ( ;
, ASCII 0x3E), указывает на комментарий . Некоторые диалекты INI, кроме того, позволяют использовать знак номера ( #
, ASCII 0x23) для обозначения комментария, отражая комментарии оболочки Unix . Некоторые диалекты INI, но не все, позволяют комментировать строку пары ключ-значение или строку раздела (называемую внутристрочным комментарием ), где некоторые требуют пробела, отделяющего значение или закрывающую скобку раздела от комментария. Тем не менее, знак номера может быть включен в имя ключа в некоторых диалектах и игнорироваться как таковой. Строки комментариев спроектированы так, чтобы их игнорировал синтаксический анализатор.
#! /bin/convert-ini-to-perl | perl | ssh wikipedia.org upload --sanitise=no ; Неоднозначно без дополнительных знаний диалекта INI: ; значение "live" или "live # dangerously"? Мне нравится = live # dangerously #var = аvar = a ; Это встроенный комментарий foo = bar # Это еще один встроенный комментарий
Согласно диалекту GetPrivateProfileString интерфейса WinAPI комментарии должны располагаться в отдельных строках.
Порядок свойств в разделе и порядок разделов в файле не имеют значения.
Большинство реализаций поддерживают только одно свойство с заданным именем в разделе. Второе появление имени свойства может вызвать прерывание , оно может быть проигнорировано (и значение отброшено) или может переопределить первое появление (с отбрасыванием первого значения). Некоторые программы используют дублирующиеся имена свойств для реализации многозначных свойств.
Интерпретация нескольких деклараций разделов с одинаковым именем также различается. В некоторых реализациях дублирующие разделы просто объединяют свои свойства, как если бы они были смежными. Другие могут прерывать или игнорировать некоторые аспекты файла INI.
Некоторые реализации позволяют заключать значения в кавычки, обычно с использованием двойных кавычек и/или апострофов . Это позволяет явно объявлять пробелы и/или заключать в кавычки специальные символы (равно, точку с запятой и т. д.). Стандартная функция Windows GetPrivateProfileString поддерживает это и удаляет кавычки, которые окружают значения.
Эмулируя синтаксис языка C , некоторые диалекты допускают перенос строк с помощью обратной косой черты ( \
, ASCII 0x5C) в качестве последнего символа в строке. [18] При таком продолжении строки обратная косая черта, за которой сразу следует EOL (конец строки), приводит к тому, что обратная косая черта и перенос строки отбрасываются, что превращает строки документа в логические строки .
Некоторые диалекты предлагают различную поддержку экранирования символов , как правило, с использованием символа обратной косой черты ( \
, ASCII 0x5C) в качестве метасимвола и эмуляции синтаксиса C. [19]
Неразумно слепо интерпретировать escape-последовательности, поскольку некоторые спецификации явно отключают метасимволы для общих escape-последовательностей. [20] [21]
Последовательность | Значение |
---|---|
\\ | \ (один обратный слеш , экранирующий экранирующий символ) |
\' | Апостроф |
\" | Двойные кавычки |
\0 | Нулевой символ |
\a | Звонок/оповещение/звуковой сигнал |
\b | Backspace , символ звонка для некоторых приложений |
\t | Символ табуляции |
\r | Возврат каретки |
\n | Перевод строки |
\; | Точка с запятой |
\# | Знак числа |
\= | Знак равенства |
\: | Колон |
\xhhhh | Символ Unicode с кодовой точкой 0xhhhh, закодированный либо в UTF-8, либо в локальной кодировке |
В Windows API профиля — это программный интерфейс, используемый для чтения и записи настроек из классических .ini
файлов Windows. Например, функция GetPrivateProfileString извлекает строку из указанного раздела в файле инициализации. («Частный» профиль противопоставляется GetProfileString
, который извлекает из WIN.INI .)
Следующий пример программы на языке C демонстрирует чтение значений свойств из приведенного выше примера INI-файла (пусть имя файла конфигурации будет dbsettings.ini
):
#include <windows.h> int main ( int argc , _TCHAR * argv []) { _TCHAR dbserver [ 1000 ]; int dbport ; GetPrivateProfileString ( "database" , "server" , "127.0.0.1" , dbserver , sizeof ( dbserver ) / sizeof ( dbserver [ 0 ]), ". \\ dbsettings.ini" ); dbport = GetPrivateProfileInt ( "database" , "port" , 143 , ". \\ dbsettings.ini" ); // NB WritePrivateProfileInt() не существует, есть только WritePrivateProfileString() вернуть 0 ; }
Третий параметр функции GetPrivateProfileString
— это значение по умолчанию, которое в двух вызовах функций выше — "127.0.0.1"
и 143
соответственно. Если аргумент, предоставленный для этого параметра, — NULL
, то значением по умолчанию будет пустая строка ""
.
В Unix существует множество различных библиотек конфигурации для доступа к файлам INI. Часто они уже включены в фреймворки и наборы инструментов. Примерами парсеров INI для Unix являются GLib, iniparser и libconfini.
Имя | Поддержка разделов | Поддержка вложенности разделов | Распознавание входа для инвалидов [22] | Многоканальная поддержка [23] | Типы значений | Поддержка чтения/записи | Платформа | Лицензия | Язык программирования | Последняя версия релиза |
---|---|---|---|---|---|---|---|---|---|---|
Анализатор конфигурации Python [24] [25] | Да | Да | Нет | Нестандартный [26] | Булево , Число , Строка | Читать + писать | *BSD , Linux , macOS , Windows | ПСФЛ | C (реализация), Python (использование) | 3.9.7 [27] |
ГЛиб [28] | Да | Да | Нет | Нет | Булево , Число , Строка , Массив | Читать + писать | *BSD , Linux , macOS , Windows | LGPL | С | 2.66.7 (11 февраля 2021 г [±] [29] (2021-02-11) [30] | )
inifile [31] | Да | Нет | Нет | Нет | Булево , Число , Строка | Читать + писать | *BSD , Linux , macOS , Windows | Апачи | Идти | 1.2.0 [32] |
иних [33] | Да | Нет | Нет | Нестандартный [34] | Булево , Число , Строка | Читать | *BSD , Linux , macOS , Windows | БСД | С | 53 [35] |
инипарсер [36] | Да | Нет | Нет | Да | Булево , Число , Строка | Читать + писать | *BSD , Linux , macOS , Windows | Массачусетский технологический институт | С | 4.2.4 [37] |
Ява (через java.util.Properties ) [38] | Нет | Нет | Нет | Да | Нить | Читать + писать | Независимый от платформы | Двойная лицензия: GPL версии 2 с исключением classpath [39] и проприетарная лицензия. [40] | C (реализация), Java (использование) | 23.0.1 (15 октября 2024 г [±]
21.0.5 LTS (15 октября 2024 г [42] ) [±]
17.0.13 LTS (15 октября 2024 г [43] ) [±]
11.0.25 LTS (15 октября 2024 г [44] ) [±]
8u431 LTS (15 октября 2024 г [45] ) [±] (2024-10-15) |
libconfini [46] | Да | Да | Да | Да | Булево , Число , Строка , Массив | Читать | *BSD , Linux , macOS , Windows | GPL | С | 1.16.2 [47] |
PHP (через parse_ini_file() ) [48] | Да | Да | Да | Нет | Число , Строка , Нуль | Читать | Linux , MacOS , Windows | Лицензия PHP v3.01 [49] | C (реализация), PHP (использование) | 8.3.13 [50] (24 октября 2024 г. (24 October 2024) | )
PyINI [51] | Да | Нет | Да | Да | Булево , Число , Строка | Читать + писать | Независимый от платформы | GPL | Питон | 1.0 [52] |
питон-ini [53] | Да | Нет | Нет | Да | Булевое значение , Число , Строка , Нуль | Читать + писать | Независимый от платформы | БСД | Питон | 1.1.0 |
RudeConfig [54] | Да | Нет | Нет | Нет | Булево , Число , Строка | Читать + писать | Linux , Windows | GPL | С++ | Прекращено – последняя версия 5.0.5, от ноября 2009 г. [55] |
API-интерфейс Windows | Да | Нет | Нет | Нет | Число , Строка , Структура | Чтение + Запись (неразрушающее) | Окна | Запатентованный | С | 24H2 (10.0.26100.2161) (24 октября 2024 г [±] (2024-10-24) | [56] )
Wine (реализация Windows API ) | Да | Нет | Нет | Нет | Число , Строка , Структура | Чтение + Запись (неразрушающее) | Linux , MacOS , Windows | LGPL | С | 9.0 [57] 16 января 2024 г. (16 January 2024) |
Rust configparser [58] | Да | Нет | Нет | Нет | Булево , Число , Строка | Читать + писать | *BSD , Linux , macOS , Windows | MIT или LGPL v3.0+ | Ржавчина | 3.0.2 [58] 11 сентября 2022 г.; 3 месяца назад |
java-ini-парсер [59] | Да | Нет | Да | Да | Булево , Число , Строка | Читать + писать | Независимый от платформы | Апачи | Ява | 1.4 [58] 29 декабря 2022 г.; 3 дня назад |
Имя | Поддержка разделов | Поддержка вложенности разделов | Распознавание входа для инвалидов | Многоканальная поддержка | Типы значений | Поддержка чтения/записи | Платформа | Лицензия | Язык программирования | Последняя версия релиза |
Сопоставление файла инициализации создает сопоставление между файлом INI и реестром Windows . [60] [61] Он был представлен в Windows NT и Windows 95 как способ перехода от хранения настроек в классических .ini
файлах к новому реестру. Сопоставление файлов перехватывает вызовы API Profile и, используя настройки из раздела реестра IniFileMapping , направляет чтение и запись в соответствующие места в реестре.
Используя пример ниже, можно сделать вызов строки для извлечения ключа имени из раздела владельца из файла настроек, скажем, dbsettings.ini
. Возвращаемым значением должна быть строка "John Doe":
GetPrivateProfileString ( "владелец" , "имя" , ... , "c:\\programs\\oldprogram\\dbsettings.ini" );
Сопоставление INI принимает этот вызов API профиля, игнорирует любой путь в указанном имени файла и проверяет, есть ли в каталоге раздел реестра, соответствующий имени файла:
Если он существует, он ищет имя записи, соответствующее запрошенному разделу. Если запись найдена, сопоставление INI использует ее значение как указатель на другую часть реестра. Затем он ищет запрошенную настройку INI в этой части реестра.
Если не найдено ни одного соответствующего имени записи и есть запись под именем записи (по умолчанию) , сопоставление INI использует ее. Таким образом, каждое имя раздела не нуждается в своей собственной записи.
(По умолчанию) | @USR:Software\oldprogs\inisettings\all |
база данных | USR:Software\oldprogs\inisettings\db |
Таким образом, в этом случае вызов профиля для раздела [owner] сопоставляется с:
имя | Джон Доу |
организация | Продукция Acme |
где имя записи реестра " name " найдено соответствующим запрошенному ключу INI. Затем значение "John Doe" возвращается в вызов Profile. В этом случае префикс @ по умолчанию предотвращает любые чтения из файла dbsettings.ini
на диске. Результатом является то, что любые настройки, не найденные в реестре, не ищутся в файле INI.
Запись реестра « база данных » не имеет префикса @ в значении; таким образом, только[database]
для раздела сначала берутся настройки в реестре, а затем настройки в файле на диске.dbsettings.ini
Начиная с Windows 95 , Microsoft начала активно продвигать использование реестра Windows вместо файлов INI. [62] Файлы INI обычно ограничены двумя уровнями (разделы и свойства) и плохо обрабатывают двоичные данные. Однако это решение не было защищено от критики из-за того, что реестр является монолитным, непрозрачным и двоичным, должен быть синхронизирован с файловой системой и представляет собой единую точку отказа для операционной системы. [63]
Позднее файлы конфигурации на основе XML стали популярным выбором для кодирования конфигурации в текстовых файлах. [ необходима ссылка ] XML допускает произвольно сложные уровни и вложенность, а также имеет стандартные механизмы для кодирования двоичных данных .
В последнее время форматы сериализации данных , такие как JSON , TOML и YAML могут служить форматами конфигурации. Эти три альтернативных формата могут вкладываться произвольно, но имеют другой синтаксис, чем файл INI. Среди них TOML наиболее похож на INI, но идея сделать TOML намеренно совместимым с большим подмножеством INI была отвергнута. [64]
Однако новейшие парсеры INI допускают тот же произвольный уровень вложенности XML , JSON , TOML и YAML , предлагают эквивалентную поддержку типизированных значений и Unicode , хотя и сохраняют «неофициальный статус» файлов INI, допуская несколько синтаксисов для выражения одного и того же. [65]
php.ini
»a
в следующем примере:[раздел]
#а=а
б=б
java.util.Properties