INI file

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search
INI file icon.png
Filename extension
Internet media type
text/plain, application/textedit, zz-application/zz-winassoc-ini
Type of formatInitialization/Configuration File

An INI file is a configuration file for computer software that consists of a text-based content with a structure and syntax comprising key–value pairs for properties, and sections that organize the properties.[1] The name of these configuration files comes from the filename extension INI, for initialization, used in the MS-DOS operating system which popularized this method of software configuration. The format has become an informal standard in many contexts of configuration, but many applications on other operating systems use different file name extensions, such as conf and cfg.[2]


The primary mechanism of software configuration in Windows was originally a text file format that comprised text lines with one key–value pair per line, organized into sections. This format was used for operating system components, such as device drivers, fonts, startup launchers. INI files were also generally used by applications to store individual settings.[3]

The format was maintained in 16-bit Microsoft Windows platforms up through Windows 3.1x. Starting with Windows 95 Microsoft favored the use of the Windows Registry and began to steer developers away from using INI files for configuration. All subsequent versions of Windows have used the Windows Registry for system configuration, but applications built on the .NET Framework use special XML .config files. The initialization-file functions are still available in Windows and developers may still use them.

Linux and Unix systems also use a similar file format for system configuration. In addition, platform-agnostic software may use this file format for configuration. It is human-readable and simple to parse, so it is a usable format for configuration files that do not require much greater complexity.

Git configuration files are similar to INI files.[4]

PHP uses the INI format for its "php.ini" configuration file in both Windows and Linux systems.[5][6]

Desktop.ini files determine the display of directories in Windows, e.g., the icons for a directory.[7]


Keys (properties)[edit]

The basic element contained in an INI file is the key or property. Every key has a name and a value, delimited by an equals sign (=). The name appears to the left of the equals sign. In the Windows implementation the equal sign and the semicolon are reserved characters and cannot appear in the key. The value can contain any character.



Keys may, but need not, be grouped into arbitrarily named sections. The section name appears on a line by itself, in square brackets ([ and ]). All keys after the section declaration are associated with that section. There is no explicit "end of section" delimiter; sections end at the next section declaration, or at the end of the file. Sections cannot be nested.


Case sensitivity[edit]

Section and property names are not case sensitive in the Windows implementation,[8] but other applications may behave differently.


Semicolons (;) at the beginning of the line indicate a comment. Comment lines are ignored.

; comment text

Varying features[edit]

The INI file format is not universally rigidly defined. Many computer programs support features beyond the basics already described. The following is a list of some common features, which may or may not be implemented in any given program.


Some software supports the use of the number sign (#) as an alternative to the semicolon for indicating comments. However, it may be included in the key name in other dialects. For instance, the following line may be interpreted as a comment in one dialect, but create a variable named "#var" in another dialect. If the "#var" value is ignored, it would form a pseudo-implementation of a variable.


More generally, use of the number sign is unpredictable, as in these following lines[clarification needed] (note the space after the number sign in the second line). For this reason, the number sign character should not be used to begin comments.[according to whom?]

# var=a

In some implementations, a comment may begin anywhere on a line, including on the same line after properties or section declarations. In others, including the WinAPI function GetPrivateProfileString, comments must occur on lines by themselves.

Duplicate names[edit]

Most implementations only support having one property with a given name in a section. The second occurrence of a property name may cause an abort, it may be ignored (and the value discarded), or it may override the first occurrence (with the first value discarded). Some programs use duplicate property names to implement multi-valued properties.

Interpretation of multiple section declarations with the same name also varies. In some implementations, duplicate sections simply merge their properties, as if they occurred contiguously. Others may abort, or ignore some aspect of the INI file.

Escape characters[edit]

Some implementations also offer varying support for an escape character, typically with the backslash (\) following the C syntax. Some support "line continuation", where a backslash followed immediately by EOL (end-of-line) causes the line break to be ignored, and the "logical line" to be continued on the next actual line from the INI file. Implementation of various "special characters" with escape sequences is also seen.[9]

Common escape sequences
Sequence Meaning
\\ \ (a single backslash, escaping the escape character)
\' Apostrophe
\" Double quotes
\0 Null character
\a Bell/Alert/Audible
\b Backspace, Bell character for some applications
\t Tab character
\r Carriage return
\n Line feed
\; Semicolon
\# Number sign
\= Equals sign
\: Colon
\x???? Unicode character with hexadecimal code point corresponding to ????

Global properties[edit]

Optional "global" properties may also be allowed, that are declared before any section is declared.[10]


Most commonly, INI files have no hierarchy of sections within sections. Some files appear to have a hierarchical naming convention, however. For section A, subsection B, sub-subsection C, property P and value V, they may accept entries such as [A.B.C] and P=V (Windows' xstart.ini), [A\B\C] and P=V (the IBM Windows driver file devlist.ini), or [A] and B,C,P = V (Microsoft Visual Studio file AEMANAGR.INI).

It is unclear whether these are simply naming conventions that an application happens to use in order to give the appearance of a hierarchy, or whether the file is being read by a module that actually presents this hierarchy to the application programmer.

Name/value delimiter[edit]

Some implementations allow a colon (:) as the name/value delimiter (instead of the equals sign). Whitespace is occasionally used in the Linux world.[11]

Quoted values[edit]

Some implementations allow values to be quoted, typically using double quotes and/or apostrophes. This allows for explicit declaration of whitespace, and/or for quoting of special characters (equals, semicolon, etc.). The standard Windows function GetPrivateProfileString supports this, and will remove quotation marks that surround the values.


Interpretation of whitespace varies. Most implementations ignore leading and trailing whitespace around the outside of the property name. Some even ignore whitespace within values (for example, making "host name" and "hostname" equivalent). Some implementations also ignore leading and trailing whitespace around the property value; others consider all characters following the equals sign (including whitespace) to be part of the value.

Order of sections and properties[edit]

In most cases the order of properties in a section and the order of sections in a file is irrelevant, but implementations may vary.


The following example file has two sections: one for the owner of the software, and one for a payroll database connection. Comments record the last person who modified the file and the reason for modification.

; last modified 1 April 2001 by John Doe
name=John Doe
organization=Acme Widgets Inc.

; use IP address in case network name resolution is not working

Accessing INI files[edit]

Under Windows, the Profile API is the programming interface used to read and write settings from classic Windows .ini files. For example, the GetPrivateProfileString function retrieves a string from the specified section in an initialization file. (The "private" profile is contrasted with GetProfileString, which fetches from WIN.INI.)

The following sample C program demonstrates reading property values from the above sample INI file (let the name of configuration file be dbsettings.ini):

#include <windows.h>

int main(int argc, _TCHAR *argv[])
  _TCHAR dbserver[1000];
  int dbport;
  GetPrivateProfileString("database", "server", "", dbserver, sizeof(dbserver) / sizeof(dbserver[0]), ".\\dbsettings.ini");
  dbport = GetPrivateProfileInt("database", "port", 143, ".\\dbsettings.ini");
  // N.B. WritePrivateProfileInt() does not exist
  return 0;

The third parameter of the GetPrivateProfileString function is the default value, which are "" and 143 respectively in the two function calls above. If the argument supplied for this parameter is NULL, the default is an empty string, "".

Under Unix, many different configuration libraries exist to access INI files. They are often already included in frameworks and toolkits. Examples of INI parsers for Unix include GLib, iniparser and libconfini.

Comparison of INI parsers[edit]

Name Sections support Section nesting support Disabled entry recognition[12] Multi-line support[13] Value types Read/Write support Platform License Programming language Latest release version
ConfigParser[14][15] Yes No No Non-standard[16] Boolean, Number, String Read + Write *BSD, Linux, macOS, Windows PSFL C (implementation), Python (usage) 3.8.2[17]
GLib[18] Yes Yes No No Boolean, Number, String, Array Read + Write *BSD, Linux, macOS, Windows LGPL C 2.66.7 (February 11, 2021; 7 months ago (2021-02-11)) [±][19]


inifile[21] Yes No No No Boolean, Number, String Read + Write *BSD, Linux, macOS, Windows Apache Go 1.2.0[22]
inih[23] Yes No No Non-standard[24] Boolean, Number, String Read *BSD, Linux, macOS, Windows BSD C 48[25]
iniparser[26] Yes No No Yes Boolean, Number, String Read + Write *BSD, Linux, macOS, Windows MIT C 4.1[27]
Java (via java.util.Properties)[28] No No No Yes String Read + Write Platform-agnostic Dual-license: GPL version 2 with classpath exception,[29] and a proprietary license.[30] C (implementation), Java (usage) 17 (September 14, 2021; 6 days ago (2021-09-14)) [±]

11.0.12 (July 20, 2021; 2 months ago (2021-07-20)[31]) [±]
8u301 (July 20, 2021; 2 months ago (2021-07-20)[32]) [±]

libconfini[33] Yes Yes Yes Yes Boolean, Number, String, Array Read *BSD, Linux, macOS, Windows GPL C 1.14.0[34]
PyINI[35] Yes No Yes Yes Boolean, Number, String Read + Write Platform-agnostic GPL Python 1.0[36]
RudeConfig[37] Yes No No No Boolean, Number, String Read + Write Linux, Windows GPL C++ Discontinued – last version is 5.0.5, from November 2009[38]
Windows API Yes No No No Number, String, Struct Read + Write (non-destructive) Windows Proprietary C 1803 (10.0.17134.112) (June 12, 2018; 3 years ago (2018-06-12)[39]) [±]
Wine (implementation of Windows API) Yes No No No Number, String, Struct Read + Write (non-destructive) Linux, macOS, Windows LGPL C 6.0.1[40] Edit this on Wikidata 7 June 2021; 3 months ago (7 June 2021)
Name Sections support Section nesting support Disabled entry recognition Multi-line support Value types Read/Write support Platform License Programming language Latest release version

File mapping[edit]

Initialization file mapping creates a mapping between an INI file and the Registry.[41][42] It was introduced with Windows NT and Windows 95 as a way to migrate from storing settings in classic .ini files to the new Windows Registry. File mapping traps the Profile API calls and, using settings from the IniFileMapping Registry section, directs reads and writes to appropriate places in the Registry.

Using the example below, a string call could be made to fetch the name key from the owner section from a settings file called, say, dbsettings.ini. The returned value should be the string "John Doe":

GetPrivateProfileString("owner", "name", ... , "c:\\programs\\oldprogram\\dbsettings.ini");

INI mapping takes this Profile API call, ignores any path in the given filename and checks to see if there is a Registry key matching the filename under the directory:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\

If this exists, it looks for an entry name matching the requested section. If an entry is found, INI mapping uses its value as a pointer to another part of the Registry. It then looks up the requested INI setting in that part of the Registry.

If no matching entry name is found and there is an entry under the (Default) entry name, INI mapping uses that instead. Thus each section name does not need its own entry.

(Default) @USR:Software\oldprogs\inisettings\all
database USR:Software\oldprogs\inisettings\db

So, in this case the profile call for the [owner] section is mapped through to:

name John Doe
organization Acme Products

where the "name" Registry entry name is found to match the requested INI key. The value of "John Doe" is then returned to the Profile call. In this case, the @ prefix on the default prevents any reads from going to the dbsettings.ini file on disk. The result is that any settings not found in the Registry are not looked for in the INI file.

The "database" Registry entry does not have the @ prefix on the value; thus, for the [database] section only, settings in the Registry are taken first followed by settings in the dbsettings.ini file on disk.


Starting with Windows 95, Microsoft began strongly promoting the use of Windows registry over the INI file.[43] INI files are typically limited to two levels (sections and properties) and do not handle binary data well. This decision however has not been immune to critiques, due to the fact that the registry is monolithic, opaque and binary, must be in sync with the filesystem, and represents a single point of failure for the operating system.[44]

Later XML-based configuration files became a popular choice for encoding configuration in text files.[citation needed] XML allows arbitrarily complex levels and nesting, and has standard mechanisms for encoding binary data.

More recently, data serialization formats, such as JSON, TOML, and YAML can serve as configuration formats. These three alternative formats can nest arbitrarily, but have a different syntax than the INI file. Among them, TOML most closely resembles INI, but the idea to make TOML deliberately compatible with a large subset of INI was rejected.[45]

The newest INI parsers however allow the same arbitrary level of nesting of XML, JSON, TOML, and YAML, offer equivalent support of typed values and Unicode, although keep the "informal status" of INI files by allowing multiple syntaxes for expressing the same thing.[46]

See also[edit]


  1. ^ Microsoft TechNet: Configure an Ini File Item
  2. ^ .conf initialization files
  3. ^ Microsoft: Windows NT Workstation Resource Kit
  4. ^ git-config CONFIGURATION FILE [1]
  5. ^ Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre. "Programming PHP". Sections "parse_ini_file", "Extension INI Entries", etc.
  6. ^ Christian Wenz. "PHP and MySQL Phrasebook". section "Parsing INI Files". quote: "... the INI file format ... was very widely used in the Windows world, but today also drives the configuration of software products like PHP. For instance, ... php.ini"
  7. ^ Codrut Neagu, "Why Are There Two Desktop.ini Files On My Desktop & What Do They Do?".
  8. ^ "GetPrivateProfileString function". Microsoft Developer Network. Microsoft. Retrieved 2012-06-02.
  9. ^ Cloanto Implementation
  10. ^ Apache Documentation for org.apache.commons.configuration2.INIConfiguration, The Apache Software Foundation
  11. ^ libconfini manual
  12. ^ It is a common practice among authors of INI files to "comment out" unwanted entries in order to disable them, instead of removing them completely. See the key a in the following example:
  13. ^ The standard syntax for line continuation refers here to the sequence of a backslash followed by line break, as implemented by iniparser, libconfini and java.util.Properties
  14. ^ Fredrik Lundh. "Python Standard Library". 2001. Section "The ConfigParser Module". p. 143
  15. ^ "ConfigParser - Configuration file parser".
  16. ^ Following the syntax of the language it is designed to work with (Python), to span a node over multiple lines ConfigParser requires a deeper indentation in the lines that follow, instead of the more common backslash + line break (see: configparser — Configuration file parser)
  17. ^ Python Documentation by Version
  18. ^ GLib Key–value file parser
  19. ^ Withnall, Philip (11 Feb 2021). "glib 2.66.7". GNOME ftp-release (Mailing list). Retrieved 12 February 2021.
  20. ^ Releases · GNOME/glib
  21. ^ inifile documentation
  22. ^ Releases · inifile
  23. ^ inih README
  24. ^ Using indentation, explicitly following ConfigParser's approach (see the project's documentation for more information)
  25. ^ Releases · benhoyt/inih
  26. ^ iniparser documentation
  27. ^ Releases · ndevilla/iniparser
  28. ^ Properties (Java Platform SE 8)
  29. ^ "OpenJDK: GPLv2 + Classpath Exception". 1989-04-01. Retrieved 2016-02-09.
  30. ^ "BCL For Java SE". 2013-04-02. Retrieved 2016-02-09.
  31. ^ "OpenJDK 11 Updates". Oracle Corporation. Retrieved 2021-04-20.
  32. ^ "OpenJDK 8 Updates". Oracle Corporation. Retrieved 2021-04-20.
  33. ^ libconfini documentation
  34. ^ Releases · madmurphy/libconfini
  35. ^ PyINI
  36. ^ Tags · whoatemybutter / PyINI
  37. ^ RudeConfig documentation
  38. ^ Releases · RudeConfig
  39. ^ "June 12, 2018—KB4284835 (OS Build 17134.112)". Microsoft Support. Microsoft.
  40. ^ "Wine 6.0.1 Released". 7 June 2021.
  41. ^ Initialization Files and the Registry, Windows NT Workstation Resource Kit, Microsoft TechNet
  42. ^ Administering the NT Registry, Managing the Windows NT Registry, Paul Robichaux, O'Reilly Media
  43. ^ The System Registry
  44. ^ Was The Windows Registry a Good Idea? – Coding Horror
  45. ^ "Comment on ".INI compatibility is a worthy goal" issue on GitHub".
  46. ^ libconfini/README

External links[edit]