stringtranslate.com

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-файлы.

Пример

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

; последнее изменение 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]

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

В 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.

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

Отображение файла

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

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

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

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

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\ CurrentVersion\IniFileMapping

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

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

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

где имя записи реестра " name " найдено соответствующим запрошенному ключу INI. Затем значение "John Doe" возвращается в вызов 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]

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

Ссылки

  1. ^ Microsoft TechNet: Настройка элемента INI-файла
  2. ^ Файлы инициализации .conf
  3. ^ Microsoft: Комплект ресурсов Windows NT Workstation
  4. ^ Microsoft Learn (2022-02-08). "Как настроить папки с помощью Desktop.ini" . Получено 2024-01-10 .
  5. ^ Кодрут Нягу, «Почему на моем рабочем столе два файла Desktop.ini и что они делают?».
  6. ^ Расмус Лердорф, Кевин Татро, Питер Макинтайр. "Программирование PHP". Разделы "parse_ini_file", "Extension INI Entries" и т. д.
  7. ^ Кристиан Венц. «PHP и MySQL Phrasebook». раздел «Анализ файлов INI». цитата: «... формат файла INI... очень широко использовался в мире Windows, но сегодня он также управляет конфигурацией таких программных продуктов, как PHP. Например, ... php.ini»
  8. ^ "ФАЙЛ КОНФИГУРАЦИИ git-config".
  9. ^ "Основной формат файла". specifications.freedesktop.org .
  10. ^ "systemd.service". www.freedesktop.org .
  11. ^ "afp.conf — файл конфигурации Netatalk" . Получено 2024-01-10 .
  12. ^ "pacman.conf(5)". archlinux.org .
  13. ^ Руководство по библиотечным функциям abc libconfini
  14. ^ Документация Apache для org.apache.commons.configuration2.INIConfiguration, Apache Software Foundation
  15. ^ Это включает реализацию Windows. См. "Функция GetPrivateProfileString". Microsoft Developer Network . Microsoft . Получено 2012-06-02 .
  16. ^ Проект Git. "config.txt" . Получено 2024-01-10 .
  17. ^ Проект Git. "config.txt" . Получено 2024-01-10 .
  18. ^ Проект Git. "config.txt" . Получено 2024-01-10 .
  19. ^ Реализация Cloanto
  20. ^ Проект Git. "config.txt" . Получено 2024-01-10 .
  21. ^ Проект Git. "config.txt" . Получено 2024-01-10 .
  22. ^ Среди авторов INI-файлов распространена практика «комментирования» нежелательных записей с целью их отключения, вместо их полного удаления. См. ключ aв следующем примере:
    [раздел] 
    #а=а
    б=б
  23. ^ Стандартный синтаксис для продолжения строки здесь относится к последовательности обратной косой черты , за которой следует перенос строки , как это реализовано iniparser, libconfini иjava.util.Properties
  24. ^ Фредрик Лунд. "Стандартная библиотека Python". 2001. Раздел "Модуль ConfigParser". стр. 143
  25. ^ "ConfigParser - Анализатор файлов конфигурации".
  26. ^ Следуя синтаксису языка, для работы с которым он предназначен ( Python ), для охвата узла на несколько строк ConfigParser требует более глубокого отступа в последующих строках вместо более распространённого обратного слеша + переноса строки (см.: configparser — Анализатор конфигурационных файлов)
  27. ^ Документация Python по версиям
  28. ^ Анализатор файлов «ключ–значение» GLib
  29. ^ Уитнолл, Филип (11 февраля 2021 г.). "glib 2.66.7". GNOME ftp-release (список рассылки) . Получено 12 февраля 2021 г.
  30. ^ Выпуски · GNOME/glib
  31. ^ документация inifile
  32. ^ Релизы · inifile
  33. ^ inih README
  34. ^ Использование отступов, явно следуя подходу ConfigParser (для получения дополнительной информации см. документацию проекта)
  35. ^ Релизы · benhoyt/inih
  36. ^ Документация iniparser
  37. ^ Релизы · iniparser/iniparser
  38. ^ Свойства (Java Platform SE 8)
  39. ^ "OpenJDK: GPLv2 + Classpath Exception". Openjdk.java.net. 1989-04-01 . Получено 2016-02-09 .
  40. ^ "BCL для Java SE". Oracle.com. 2013-04-02 . Получено 2016-02-09 .
  41. ^ "JDK Releases". Oracle Corporation . Получено 2022-12-09 .
  42. ^ "JDK Releases". Oracle Corporation . Получено 2024-01-17 .
  43. ^ Документация libconfini
  44. ^ Релизы · madmurphy/libconfini
  45. ^ PHP . "parse_ini_file() — Анализ файла конфигурации". Официальная документация PHP . Получено 2022-07-19 .
  46. ^ Лицензия PHP v3.01[1]
  47. ^ "Версия 8.3.11". 29 августа 2024 г. Получено 30 августа 2024 г.
  48. ^ ПыИНИ
  49. ^ Теги · whoatemybutter / PyINI
  50. ^ python-ini
  51. ^ Документация RudeConfig
  52. ^ Релизы · RudeConfig
  53. ^ "10 сентября 2024 г. — KB5043076 (сборки ОС 22621.4169 и 22631.4169)". Поддержка Microsoft . Microsoft .
  54. ^ "Wine 9.0 Released". 16 января 2024 г. Получено 16 января 2024 г.
  55. ^ abc "configparser on crates.io". crates.io . 2022-12-12. Архивировано из оригинала 2022-12-12 . Получено 2022-12-12 .
  56. ^ Страница java-ini-parser на github
  57. ^ Файлы инициализации и реестр, Windows NT Workstation Resource Kit , Microsoft TechNet
  58. ^ Администрирование реестра NT, Управление реестром Windows NT , Пол Робишо, O'Reilly Media
  59. ^ Системный реестр
  60. ^ Реестр Windows был хорошей идеей? – Coding Horror
  61. ^ "Комментарий к вопросу "Совместимость с .INI — достойная цель" на GitHub". GitHub .
  62. ^ libconfini/README

Внешние ссылки