Файл INI — это файл конфигурации для компьютерного программного обеспечения , который состоит из текстового содержимого со структурой и синтаксисом, включающим пары ключ-значение для свойств, и разделов, которые упорядочивают свойства. [1] Название этих файлов конфигурации происходит от расширения имени файла INI , обозначающего инициализацию , используемого в операционной системе 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.
В следующем примере файла есть два раздела: один для владельца программного обеспечения и один для подключения к базе данных расчета заработной платы. В комментариях указывается имя последнего человека, изменившего файл, и причина изменения.
; последнее изменение: 1 апреля 2001 г. Джоном Доу [владелец] имя = Джон Доу организация = Acme Widgets Inc. [база данных] ; используйте IP-адрес, если разрешение сетевых имен не работает. server = 192.0.2.62 port = 143 file = "payroll.dat"
В более широком смысле .INI — это неформальный формат, который хорошо подходит для специальной реализации, оставаясь при этом настраиваемым человеком. Следовательно, существует множество различных спецификаций (иногда реализация синтаксического анализатора является единственной когда-либо написанной спецификацией), называемых диалектами .INI .
Хотя интерпретация .INI во многом зависит от личного вкуса и вычислительной среды (например: необходимость в данных с точностью до пробелов; потребность в информации о типе поля; Windows предпочитает свертывание регистра, Unix предпочитает чувствительность к регистру; #
-разграниченные комментарии заимствованы из сценариев Unix) , что делает .INI склонным к распространению, существует жесткое ядро, с которым обычно ассоциируется формат .INI : текстовые и строковые, пробелы удаляются, пустые строки и строки комментариев (например, ; registers to system-wide mailcap
) # workaround for d5cb328
игнорируются, квадратные скобки обозначают разделы (например, [Unit]
, [branch "master"]
), данные в виде пар ключ-значение, часто обозначаемые знаком равенства (ASCII 0x3D) (например, , IconFile=Folder.ico
) time machine = yes
.
Существуют попытки создать парсеры, способные поддерживать как можно больше диалектов, [13] и в своей наиболее сложной интерпретации формат .INI способен выражать произвольные S-выражения , что делает его эквивалентным стандартизированным форматам, таким как XML или JSON , хотя и с синтаксис, который не высечен в камне и некоторым может показаться более удобным.
Поскольку формат файла .INI жестко не определен, многие анализаторы поддерживают функции, выходящие за рамки общего ядра. реализованная поддержка очень нестабильна.
Данные в .INI хранятся в парах ключ-значение, называемых ключом или свойством . Таким образом, ключ может относиться либо ко всей паре ключ-значение, либо только к ее ключу. Значение также называется именем свойства . В текстовом представлении пара ключ-значение представлена либо линией, либо мультистркой, где начало значения обозначается разделителем , чаще всего знаком равенства ( =
, ASCII 0x3D), но иногда также двоеточием ( :
, ASCII 0x3A ) или пробелы (иногда используемые в мире GNU [13] ). Ключ ключа отображается слева от разделителя, часто непустой и не должен содержать разделитель. Некоторые варианты допускают escape-последовательности в значении.
В реализации Windows знак равенства и точка с запятой являются зарезервированными символами и не могут присутствовать в ключе. Ключ, окружающий пробелы, удаляется. Значение может содержать любой символ (в стиле Windows разделитель не окружен пробелами: например, IconFile=Folder.ico
).
Пары ключ-значение могут выглядеть так:
ключ = ключ=v имя = значение sem = ; семвер = v5822.433.2
Пары ключ-значение могут быть сгруппированы в разделе . Некоторые диалекты .INI требуют, чтобы каждая пара ключ-значение находилась в разделе, некоторые допускают так называемые глобальные свойства . [14] Когда пары ключ-значение сгруппированы, имя раздела отображается в отдельной строке, заключенное в квадратные скобки ( [
, ASCII 0x5B и ]
, ASCII 0x5D), и применяется ко всем парам ключ-значение в последующих строках до следующего раздела. объявлено. Не существует явного разделителя «конца раздела» (например, XML) </tag>
. Таким образом, разделы синтаксически не могут быть произвольно вложены. При необходимости вложение может быть реализовано путем сглаживания иерархии и объединения с пользовательским символом-разделителем внутри имени раздела (часто .
, ASCII 0x2E). Часто поддерживается один уровень вложенности, называемый подразделами .
Пример документа .INI, использующего вложенные разделы:
[project] name = служба аренды фруктовых садов (с приложением) целевой регион = «Bay Area» ; ЗАДАЧА: разместить объявление о вакансиях команды юристов = (вакантно) [фрукт «Яблоко»] проблемы с товарным знаком = предсказуемый вкус = известен [fruit.Date] вкус = новые проблемы с товарными знаками = «действительно маловероятно» [фрукты «Малина»] ожидаемые проблемы = «логистика (хрупкие плоды)» Проблемы с торговой маркой = \ возможно [fruit.raspberry.proponts.fred] date = 2021-11-23, 08:54 +0900 комментарий = «Мне нравятся красные фрукты». [фрукты "Дата/сторонники/альфред"] комментарий : Да ведь \ \ \ я бы купил финики. # сворачивание: «\\\\\nn» интерпретируется как «\\n» или «\n»? # Или "\\\\" предотвращает свертывание? редактор = Мое имя может содержать символ новой строки \\ .
Некоторые парсеры допускают вложение разделов, используя точки в качестве разделителей пути:
[раздел] домен = example.com [section.subsection] foo = бар
В некоторых случаях также поддерживается относительная вложенность, где точка в начале обозначает вложенность в предыдущий раздел: [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/конвертировать-ini-в-perl | перл | ssh wikipedia.org загрузить --sanitise=no ; Неоднозначно без дальнейшего знания диалекта .INI: ; значение «жить» или «жить # опасно»? Мне нравится = жить # опасно #вар = авар = а ; Это встроенный комментарий foo = bar # Это еще один встроенный комментарий
В диалекте GetPrivateProfileString WinAPI комментарии должны появляться в строках сами по себе.
Порядок свойств в разделе и порядок разделов в файле не имеют значения.
Большинство реализаций поддерживают наличие в разделе только одного свойства с заданным именем. Второе появление имени свойства может вызвать прерывание , оно может быть проигнорировано (и значение отброшено) или может переопределить первое появление (при этом первое значение будет отброшено). Некоторые программы используют повторяющиеся имена свойств для реализации многозначных свойств.
Интерпретация нескольких объявлений разделов с одинаковым именем также различается. В некоторых реализациях повторяющиеся разделы просто объединяют свои свойства, как если бы они находились рядом. Другие могут прервать работу или проигнорировать некоторые аспекты файла INI.
Некоторые реализации позволяют заключать значения в кавычки, обычно с использованием двойных кавычек и/или апострофов . Это позволяет явно объявлять пробелы и/или заключать в кавычки специальные символы (равно, точку с запятой и т. д.). Стандартная функция Windows GetPrivateProfileString поддерживает это и удаляет кавычки, окружающие значения.
Эмулируя синтаксис C , некоторые диалекты допускают свертывание строки по обратной косой черте ( \
ASCII 0x5C) в качестве последнего символа в строке. [18] В таком продолжении строки обратная косая черта, за которой сразу следует EOL (конец строки), приводит к отбрасыванию обратной косой черты и разрыва строки, преобразуя строки документа в логические строки .
Некоторые диалекты предлагают различную поддержку экранирования символов , обычно с помощью символа обратной косой черты ( \
, ASCII 0x5C) в качестве метасимвола и эмуляции синтаксиса C. [19]
Неразумно слепо интерпретировать escape-последовательности, поскольку некоторые спецификации явно отключают метасимволы для распространенных escape-последовательностей. [20] [21]
В Windows Profile API — это программный интерфейс, используемый для чтения и записи настроек из классических файлов Windows .ini. Например, функция GetPrivateProfileString извлекает строку из указанного раздела файла инициализации. (Частный профиль противопоставляется GetProfileString
, который извлекается из WIN.INI .)
Следующий пример программы на C демонстрирует чтение значений свойств из приведенного выше примера INI-файла (пусть имя файла конфигурации будет dbsettings.ini
):
#include <windows.h> int main ( int argc , _TCHAR * argv []) { _TCHAR сервер базы данных [ 1000 ]; интервал базы данных ; GetPrivateProfileString ( "database" , "server" , "127.0.0.1" , dbserver , sizeof ( dbserver ) / sizeof ( dbserver [ 0 ]), ". \\ dbsettings.ini" ); dbport = GetPrivateProfileInt ( "база данных" , "порт" , 143 , ". \\ dbsettings.ini" ); // Обратите внимание: WritePrivateProfileInt() не существует, есть только WritePrivateProfileString() вернуть 0 ; }
Третий параметр функции GetPrivateProfileString — это значение по умолчанию, которое равно «127.0.0.1» и 143 соответственно в двух вызовах функций выше. Если аргумент, указанный для этого параметра, равен NULL , значением по умолчанию является пустая строка "" .
В Unix существует множество различных библиотек конфигурации для доступа к файлам INI. Зачастую они уже включены в фреймворки и наборы инструментов. Примеры анализаторов INI для Unix включают GLib, iniparser и libconfini.
Сопоставление файла инициализации создает сопоставление между INI-файлом и реестром Windows . [57] [58] Он был представлен в Windows NT и Windows 95 как способ перехода от хранения настроек в классических файлах .ini к новому реестру. Сопоставление файлов перехватывает вызовы Profile API и, используя настройки из раздела реестра IniFileMapping , направляет операции чтения и записи в соответствующие места реестра.
Используя приведенный ниже пример, можно выполнить строковый вызов для получения ключа имени из раздела владельца из файла настроек, скажем, dbsettings.ini . Возвращаемое значение должно быть строкой «Джон Доу»:
GetPrivateProfileString("владелец", "имя", ... , "c:\\programs\\oldprogram\\dbsettings.ini");
Сопоставление INI принимает этот вызов Profile API, игнорирует любой путь в данном имени файла и проверяет, существует ли ключ реестра, соответствующий имени файла в каталоге:
Если он существует, он ищет имя записи, соответствующее запрошенному разделу. Если запись найдена, сопоставление INI использует ее значение как указатель на другую часть реестра. Затем он ищет запрошенную настройку INI в этой части реестра.
Если соответствующее имя записи не найдено, а под именем записи (по умолчанию) есть запись , вместо этого используется сопоставление INI. Таким образом, для каждого имени раздела не требуется отдельная запись.
Итак, в этом случае вызов профиля для раздела [владелец] сопоставляется с:
где имя записи реестра " name " соответствует запрошенному ключу INI. Затем значение «Джон Доу» возвращается при вызове Profile. В этом случае префикс @ по умолчанию предотвращает чтение файла dbsettings.ini на диске. В результате любые настройки, которых нет в реестре, не ищутся в INI-файле.
Запись реестра « база данных » не имеет префикса @ в значении; таким образом, только для [database]
раздела сначала выполняются настройки в реестре, а затем — в файле dbsettings.ini на диске.
Начиная с Windows 95 , Microsoft начала активно продвигать использование реестра Windows вместо файлов INI. [59] Файлы INI обычно ограничены двумя уровнями (разделы и свойства) и плохо обрабатывают двоичные данные. Это решение, однако, не было защищено от критики, поскольку реестр является монолитным, непрозрачным и двоичным, должен синхронизироваться с файловой системой и представляет собой единую точку отказа для операционной системы. [60]
Позже файлы конфигурации на основе XML стали популярным выбором для кодирования конфигурации в текстовых файлах. [ необходима цитация ] XML допускает произвольно сложные уровни и вложенность, а также имеет стандартные механизмы для кодирования двоичных данных .
В последнее время форматы сериализации данных , такие как JSON , TOML и YAML , могут служить форматами конфигурации. Эти три альтернативных формата могут вкладываться произвольно, но их синтаксис отличается от синтаксиса INI-файла. Среди них TOML больше всего похож на INI, но идея сделать TOML намеренно совместимым с большим подмножеством INI была отвергнута. [61]
Однако новейшие анализаторы INI допускают одинаковый произвольный уровень вложенности XML , JSON , TOML и YAML , предлагают эквивалентную поддержку типизированных значений и Unicode , хотя сохраняют «неформальный статус» файлов INI, позволяя использовать несколько синтаксисов для выражения одного и того же. . [62]
php.ini
"a
в следующем примере:[раздел]
#a=a
b=b
java.util.Properties