stringtranslate.com

INI-файл

Файл 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 (конец строки), приводит к отбрасыванию обратной косой черты и разрыва строки, преобразуя строки документа в логические строки .

Escape-персонажи

Некоторые диалекты предлагают различную поддержку экранирования символов , обычно с помощью символа обратной косой черты ( \, ASCII 0x5C) в качестве метасимвола и эмуляции синтаксиса C. [19]

Неразумно слепо интерпретировать escape-последовательности, поскольку некоторые спецификации явно отключают метасимволы для распространенных escape-последовательностей. [20] [21]

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

В 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

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

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

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

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

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

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

Если он существует, он ищет имя записи, соответствующее запрошенному разделу. Если запись найдена, сопоставление 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]

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

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

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

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