Введение

Формат файла конфигурации

Файл INI — это файл конфигурации для компьютерного программного обеспечения, состоящий из текстового содержимого с определенной структурой и синтаксисом, включающим пары «ключ-значение» для свойств и разделы, организующие эти свойства. Название этих файлов конфигурации происходит от расширения имени файла INI (от слова "initialization" – инициализация), которое использовалось в операционной системе MS-DOS и способствовало популяризации этого метода настройки программного обеспечения. Этот формат стал неформальным стандартом во многих областях конфигурации, однако многие приложения в других операционных системах используют различные расширения файлов, такие как conf и cfg.

История

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

Распространенность

Ниже приведен неисчерпывающий список мест, где встречаются файлы INI. Файлы .ini по-прежнему используются в Windows для настройки свойств каталогов, например, для указания значка папки. Файл php.ini в PHP использует формат INI. Файл git/config в Git написан в формате, близком к INI. Файлы *.desktop в freedesktop.org используют формат, близкий к INI, для описания элементов рабочего стола. Файлы конфигурации юнитов systemd *.service написаны в формате INI. Файл afp.conf в Netatalk написан на языке конфигурации в стиле INI. Файл pacman.conf в Pacman написан в формате INI.

Формат

В более широком смысле, INI — это неформальный формат, который хорошо подходит для реализации «на скорую руку», оставаясь при этом настраиваемым пользователем. Следовательно, существует множество различных спецификаций (где иногда реализация парсера является единственной когда-либо написанной спецификацией), называемых диалектами INI. Интерпретации INI во многом зависят от личных предпочтений и вычислительной среды (например, от необходимости точного соответствия пробелам, от необходимости информации о типе поля, от предпочтения Windows к приведению к одному регистру и Unix к чувствительности к регистру, от заимствования комментариев, обозначенных символом #, из скриптов Unix), что делает INI склонным к фрагментации. Однако существует базовый набор характеристик, с которыми обычно ассоциируется INI: текстовый и построчный формат, удаление пробелов, игнорирование пустых строк и строк комментариев (например, ; регистрирует в системном mailcap, # обходное решение для d5cb328), обозначение разделов квадратными скобками (например, [Unit], [branch "master"]), представление данных в виде пар ключ-значение, часто разделенных знаком равенства (ASCII 0x3D) (например, IconFile=Folder.ico, time machine = yes). Предпринимаются попытки создать парсеры, способные поддерживать как можно больше диалектов, и в своей наиболее сложной интерпретации формат INI способен выражать произвольные S-выражения, что делает его эквивалентным стандартизированным форматам, таким как XML или JSON, хотя и с синтаксисом, который не является строго фиксированным и для некоторых может быть более удобным. Поскольку формат файла INI не имеет жесткого определения, многие парсеры поддерживают функции, выходящие за рамки базового набора. Реализованная поддержка может сильно различаться.

Порядок секций и свойств

Порядок свойств в разделе и порядок разделов в файле не имеют значения.

Дублирующие имена

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

Цитируемые значения

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

Продолжение линии

Эмулируя синтаксис C, некоторые диалекты допускают перенос строки с помощью обратной косой черты (\, ASCII 0x5C) в конце строки. В случае такого переноса, обратные косые черты, непосредственно за которыми следует символ конца строки (EOL), удаляются вместе с разрывом строки, преобразуя физические строки документа в логические строки.

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

Начиная с Windows 95, Microsoft стала активно продвигать использование реестра Windows вместо файлов INI. Файлы INI обычно ограничены двумя уровнями (разделами и свойствами) и плохо подходят для работы с двоичными данными. Однако это решение вызвало критику, поскольку реестр является монолитным, непрозрачным и двоичным, требует синхронизации с файловой системой и представляет собой единую точку отказа операционной системы. Позже файлы конфигурации на основе XML стали популярным выбором для кодирования настроек в текстовых файлах. XML позволяет произвольно сложные уровни и вложенность, а также имеет стандартные механизмы для кодирования двоичных данных. В последнее время форматы сериализации данных, такие как JSON, TOML и YAML, стали использоваться в качестве форматов конфигурации. Эти три альтернативных формата поддерживают произвольную вложенность, но имеют синтаксис, отличный от INI. Среди них TOML наиболее близок к INI, но идея намеренного обеспечения совместимости TOML с большой частью синтаксиса INI была отклонена. Однако современные парсеры INI обеспечивают такую же произвольную вложенность, как у XML, JSON, TOML и YAML, поддерживают типизированные значения и Unicode, хотя и сохраняют "неформальный статус" файлов INI, допуская использование нескольких синтаксисов для выражения одного и того же.