INI 파일
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
INI 파일은 설정 정보를 저장하는 데 사용되는 텍스트 파일 형식이다. 각 INI 파일은 매개변수, 섹션, 주석으로 구성된다. 매개변수는 이름과 값을 등호로 구분하며, 섹션은 여러 매개변수를 괄호로 묶어 그룹화한다. 세미콜론은 주석을 나타낸다. INI 파일은 윈도우 운영체제에서 널리 사용되었으나, 윈도우 레지스트리, XML, JSON, TOML, YAML 등 다른 형식으로 대체되었다. 다양한 프로그래밍 언어에서 INI 파일을 파싱하는 라이브러리를 제공하며, 파서마다 기능과 지원하는 기능에 차이가 있다.
더 읽어볼만한 페이지
- 설정 파일 - MSDOS.SYS
MSDOS.SYS는 MS-DOS 운영 체제의 핵심 시스템 파일로, 부팅 과정에서 시스템 초기화 및 하드웨어 설정을 관리하며, 윈도우 9x 시리즈 등장 이후에는 윈도우 부팅 옵션을 설정하는 텍스트 파일로 기능이 변화되었다. - 설정 파일 - AUTOEXEC.BAT
AUTOEXEC.BAT는 도스 및 초기 윈도우 운영 체제에서 컴퓨터 시동 시 실행되어 환경 변수 설정, 시스템 유틸리티 실행 등에 사용되는 배치 파일이다. - 파일 포맷 - 바로 가기
바로 가기는 운영체제에서 파일, 폴더, 프로그램, 웹 페이지에 대한 참조를 제공하는 기능 및 파일로, 사용자들이 원본에 빠르게 접근하도록 GUI 환경의 사용성을 향상시킨다. - 파일 포맷 - EXE
EXE 파일 형식은 운영 체제에 따라 다양한 종류가 있는 실행 파일의 한 형태로, DOS MZ 실행 파일에서 PE, PE32+까지 발전해 왔으며, 코드, 데이터, 스택을 별도 관리하고 재배치 항목을 통해 실행 환경에 유연하게 대응하는 특징을 가진다.
| INI 파일 - [IT 관련 정보]에 관한 문서 | |
|---|---|
| 기본 정보 | |
| 파일 확장자 | .ini |
| MIME 형식 | text/plain, application/textedit, zz-application/zz-winassoc-ini |
| 종류 | 초기화/구성 파일 |
2. 형식
INI 파일은 기본적으로 세 가지 주요 요소로 구성된다: 매개변수, 섹션, 주석.
- 매개변수: 파일의 가장 기본적인 단위로, '이름'(키)과 '값'이 등호(=) 등으로 구분되어 한 쌍을 이룬다.
- 섹션: 관련된 매개변수들을 그룹화하는 역할을 하며, 섹션 이름은 대괄호([ ])로 묶어 표시한다.
- 주석: 일반적으로 세미콜론(;)으로 시작하며, 해당 줄의 나머지 부분은 프로그램 설정에 영향을 주지 않는 설명이나 메모로 사용된다.
원래 INI 파일 형식은 Windows에서 소프트웨어 구성을 위한 주된 텍스트 파일 형식이었다. 운영체제의 구성 요소(예: 장치 드라이버, 글꼴, 시작 관리자)나 개별 응용 프로그램의 설정을 저장하는 데 널리 사용되었다.[3] 이 형식은 Windows 3.1x까지 16비트 Microsoft Windows 플랫폼에서 주로 사용되었으나, Windows 95 출시 이후 마이크로소프트는 구성 정보 저장을 위해 Windows 레지스트리 사용을 권장하기 시작했다. 이후 .NET Framework 기반 응용 프로그램은 주로 XML 형식의 `.config` 파일을 사용한다. 그럼에도 불구하고 초기화 파일 기능은 여전히 Windows에서 지원되며, 개발자들은 필요에 따라 계속 사용할 수 있다.
Windows 외에도 플랫폼 독립적인 소프트웨어나 일부 Unix 계열 운영체제의 구성 파일에서도 INI 파일과 유사한 형식을 사용한다. INI 파일은 사람이 읽을 수 있고 구문 분석이 비교적 간단하기 때문에, 복잡한 구조가 필요하지 않은 구성 파일 형식으로 여전히 유용하게 사용된다.
그러나 INI 파일 형식은 엄격하게 표준화되지 않았기 때문에, 구현 방식에 따라 세부 규칙이 다른 다양한 변형, 즉 INI 방언(INI dialect)이 존재한다.[13] 이는 공백 처리, 필드 유형 정보, 대소문자 구분 여부, 주석 처리 방식 등에서 차이를 보이며, 개인적인 선호나 특정 컴퓨팅 환경의 요구 사항에 따라 달라질 수 있다. 이러한 다양성에도 불구하고, 대부분의 INI 스타일 구현은 일반적으로 각 줄에 키-값 쌍이 있고, 등호로 구분되며, 대괄호로 표시된 섹션으로 구성된 텍스트 파일이라는 공통적인 설계 특징을 공유한다. 다양한 방언을 지원하려는 파서 개발 시도도 있으며,[13] 가장 복잡한 해석에서는 INI 형식이 임의의 S-표현식을 표현할 수도 있어 XML이나 JSON과 같은 표준화된 형식과 유사한 표현력을 가질 수도 있다. 결과적으로 INI 파일은 구현체마다 지원하는 기능이 매우 가변적이다.
2. 1. 매개변수
INI 파일의 기본 요소는 매개변수(parameter)이다. 각 매개변수는 이름(name 또는 키(key))과 값(value)으로 구성되며, 이 둘은 보통 등호('=')로 구분된다. 이름은 등호 왼쪽에, 값은 등호 오른쪽에 위치한다.이름 = 값
데이터는 이름(키)과 값으로 이루어진 한 쌍, 즉 키-값 쌍(key-value pair) 형태로 저장된다. 키는 때로 속성 이름(attribute name)이라고도 불린다. 키-값 쌍은 텍스트 파일에서 일반적으로 한 줄에 하나씩 표현된다.
키와 값을 구분하는 구분 기호로는 주로 등호('=')가 사용되지만, 콜론(':')이나 공백(주로 GNU 환경에서 사용됨[13])이 사용되기도 한다. 키는 일반적으로 비어 있지 않으며 구분 기호를 포함해서는 안 된다. 값에는 이스케이프 시퀀스를 사용할 수 있는 형식도 있다.
Windows 구현에서는 등호(=)와 세미콜론(;)이 예약된 문자이므로 키에 사용할 수 없다. 키를 둘러싼 공백은 무시된다.
값에는 모든 문자를 포함할 수 있다.
다음은 매개변수의 예시이다.
key=key=v
name =value
sem=;
semver=v5822.433.2
2. 2. 섹션
매개변수(키-값 쌍)는 임의의 이름으로 지정된 여러 개의 섹션으로 그룹화될 수 있다.[14] 섹션 이름은 한 줄에 대괄호([와 ])로 묶어서 표시한다.[14][섹션 이름]
섹션 선언 다음에 오는 매개변수들은 해당 섹션에 속하게 된다. 섹션은 다음 섹션이 선언되거나 파일의 끝에서 종료되며, 명시적인 "섹션 종료" 구분 문자(예: XML의
</tag>)는 없다.[14] 따라서 섹션은 기본적으로 중첩될 수 없다.[14]일부 INI 구현 방식에서는 모든 키-값 쌍이 반드시 섹션 안에 있어야 하지만, 어떤 방식에서는 섹션에 속하지 않는 이른바 ''전역 속성''을 허용하기도 한다.[14]
섹션 중첩이 필요한 경우, 계층 구조를 평탄화하고 섹션 이름 안에 사용자 지정 구분자(보통 점 `.`)를 사용하여 연결하는 방식으로 구현할 수 있다.[14] 이를 통해 ''하위 섹션''이라고 불리는 한 단계 수준의 중첩을 지원하기도 한다.[14]
다음은 중첩된 섹션(하위 섹션)을 사용한 INI 파일의 예시이다.
[project]
name = orchard rental service (with app)
target region = "Bay Area"
; TODO: advertise vacant positions
legal team = (vacant)
[fruit "Apple"]
trademark issues = foreseeable
taste = known
[fruit.Date]
taste = novel
Trademark Issues="truly unlikely"
[fruit "Raspberry"]
anticipated problems ="logistics (fragile fruit)"
Trademark Issues=\
possible
[fruit.raspberry.proponents.fred]
date = 2021-11-23, 08:54 +0900
comment = "I like red fruit."
[fruit "Date/proponents/alfred"]
comment: Why, \
\
\
I would buy dates.
# folding: Is "\\\\\nn" interpreted as "\\n" or "\n"?
# Or does "\\\\" prevent folding?
editor =My name may contain a \\
newline.
섹션을 사용하면 관련된 설정들을 함께 묶어 관리할 수 있어 구성 파일의 가독성을 높이는 데 도움이 된다.
2. 3. 주석
세미콜론(;)은 주석의 시작을 나타낸다. 주석은 세미콜론부터 해당 줄의 끝까지 유효하며, 프로그램은 이 부분을 해석하지 않고 무시한다.[1][2] 주석은 주로 설정 파일에 대한 설명이나 참고 사항을 기록하는 데 사용된다.; 이것은 주석입니다. 프로그램은 이 줄을 무시합니다.
일부 INI 파일 형식(방언)에서는 유닉스 셸 스크립트처럼 넘버 기호(#)를 사용하여 주석을 나타내는 것도 허용한다.[1]
# 이것도 주석으로 처리될 수 있습니다. (일부 방언)
또한, 일부 방언에서는 키-값 쌍이나 섹션 선언과 같은 줄에 주석을 작성하는 것(인라인 주석)을 허용하기도 한다. 하지만 모든 방언에서 이를 지원하는 것은 아니며, 값이나 섹션 닫는 괄호와 주석 사이에 공백이 필요한 경우도 있다.[1]
키 = 값 ; 이것은 인라인 주석입니다. (일부 방언)
다른키 = 다른값 # 이것도 인라인 주석입니다. (일부 방언)
윈도우 API의 `GetPrivateProfileString` 함수와 같은 특정 구현에서는 주석이 반드시 별도의 줄에 있어야 하며, 인라인 주석을 허용하지 않을 수 있다.[1]
2. 4. 기타 기능
INI 파일 형식은 엄격하게 정의된 표준이 없기 때문에, 기본적인 기능 외에 다양한 추가 기능을 지원하는 여러 구현체(소위 ''INI 방언'')가 존재한다.[13] 구현체마다 지원하는 기능이 매우 다양하며, 일반적인 추가 기능은 다음과 같다.'''빈 줄'''
: 간단한 프로그램 중에는 빈 줄을 허용하지 않는 경우도 있다. 이 경우 모든 줄은 섹션 선언, 매개변수 또는 주석이어야 한다.
'''따옴표'''
: 일부 구현에서는 값을 따옴표로 묶는 것을 허용한다. 주로 쌍따옴표(" ")나 홑따옴표(' ') 또는 둘 다 사용된다. 이를 통해 값 안에 명시적으로 공백 문자를 포함하거나 등호(=), 세미콜론(;) 같은 특수 문자를 사용할 수 있다. 윈도우 API 함수인 ''GetPrivateProfileString''은 값의 앞뒤를 감싸는 따옴표를 제거하는 방식으로 이를 지원한다.
'''주석'''
: 기본적으로 세미콜론(;)이 줄의 시작 부분에 오면 주석으로 처리된다. 일부 구현체에서는 유닉스 셸 스크립트처럼 넘버 기호(#)를 주석 문자로 사용하기도 한다.[60]
: 주석의 위치에 대한 처리도 구현체마다 다르다. 어떤 구현체는 반드시 줄의 맨 앞에서만 주석을 허용하는 반면, 다른 구현체는 코드 중간(키-값 쌍이나 섹션 선언 뒤)에 주석을 넣는 것(소위 ''인라인 주석'')을 허용하기도 한다. 인라인 주석을 허용하는 경우, 값이나 섹션 닫는 괄호와 주석 사이에 공백이 필요한 경우도 있다.
::; 이것은 전체 줄 주석입니다.
::# 이것도 전체 줄 주석일 수 있습니다 (구현체에 따라 다름).
::
::var = a ; 이것은 인라인 주석입니다.
::foo = bar # 이것도 인라인 주석일 수 있습니다.
::
::; WinAPI의 GetPrivateProfileString 방언에서는 주석은 반드시
::; 다음과 같이 별도의 줄에 있어야 합니다.
::; I_like_to = live # dangerously ; 이 줄은 모호할 수 있음
: 윈도우의 구현(예: ''GetPrivateProfileString'' 함수)에서는 세미콜론만 주석 문자로 인식하며, 주석은 반드시 줄의 시작 부분에 와야 한다.[59]
'''대소문자 구분'''
: 섹션 이름과 속성(매개변수) 이름의 대소문자 구분 여부는 구현체에 따라 다르다. 윈도우에서는 일반적으로 대소문자를 구분하지 않지만[15][61], 대부분의 유닉스 계열 구현체는 대소문자를 구분한다. 일부 유닉스 계열 구현체는 섹션 이름[16]이나 키[17]에 대해서만 대소문자 구분을 하지 않도록 허용하기도 한다.
'''이름 중복'''
: 대부분의 구현체는 한 섹션 내에서 동일한 이름의 속성을 하나만 허용한다. 이름이 중복될 경우, 프로그램이 중단되거나, 두 번째 값을 무시하거나, 첫 번째 값을 두 번째 값으로 덮어쓰는 등 다르게 처리될 수 있다. 일부 프로그램은 중복된 속성 이름을 사용하여 여러 값을 가지는 속성을 구현하기도 한다.
: 동일한 이름의 섹션이 여러 번 선언될 경우의 처리 방식도 다양하다. 어떤 구현체는 중복된 섹션의 속성들을 하나로 합치기도 하고, 다른 구현체는 오류를 발생시키거나 일부를 무시하기도 한다.
'''이름/값 구분자'''
: 일반적으로 등호(=)를 사용하여 이름과 값을 구분하지만, 일부 구현체에서는 콜론(:)을 구분자로 사용하기도 한다.
'''계층 구조 (중첩)'''
: 공식적으로 INI 파일 형식은 섹션의 계층 구조를 지원하지 않는다. 하지만 일부 구현체나 관례적으로 계층 구조를 표현하는 방법이 사용되기도 한다.
:* 점(.) 사용: 섹션 이름에 점을 넣어 계층을 표현하는 방식이다 (예: `[A.B.C]`). 일부 파서는 이를 실제 중첩으로 해석한다.
::[section]
::domain = example.com
::
::[section.subsection]
::foo = bar
:* 상대 중첩: 일부 파서는 선행하는 점(.)을 사용하여 이전 섹션에 대한 상대적인 중첩을 나타내기도 한다.
::[section]
::domain = example.com
::
::[.subsection]
::foo = bar
:* 기타 구분자: 과거에는 백슬래시(\)를 사용하거나(예: IBM 드라이버 파일의 `[A\B\C]`), 완전히 다른 문법(예: Microsoft Visual Studio의 `[A]` 섹션 아래 `B,C,P = V`)을 사용하기도 했다.
: 이러한 표기법이 단순히 가독성을 위한 관례인지, 아니면 프로그램이 실제로 계층 구조를 이해하고 처리하는지는 구현체에 따라 다르다.
'''이스케이프 문자'''
: 일부 구현체는 이스케이프 문자 처리를 지원하며, 주로 백슬래시(\)를 사용한다 (환경에 따라 원 기호(¥)로 표시될 수 있다).[19]
:* '''줄 연속''': 줄 끝에 백슬래시(\)가 오면 줄 바꿈 문자를 무시하고 다음 줄까지 하나의 논리 행으로 처리하는 경우가 있다.[18]
:* '''특수 문자 이스케이프''': C 언어와 유사하게 백슬래시 뒤에 특정 문자를 조합하여 특수 문자를 표현하는 이스케이프 시퀀스를 지원하기도 한다. 일반적인 이스케이프 시퀀스는 다음과 같다.[20][21]
| 표기 | 의미 |
|---|---|
| \\ | \ (백슬래시 자체) |
| \' | ' (아포스트로피) |
| \" | " (큰따옴표) |
| \0 | Null 문자 |
| \a | 벨 문자 |
| \b | 백스페이스 (드물게 벨) |
| \t | 탭 문자 |
| \r | 캐리지 리턴 |
| \n | 줄 바꿈 |
| \; | ; (세미콜론) |
| \# | # (넘버 기호) |
| \= | = (등호) |
| \: | : (콜론) |
| \xhhhh | 16진 표기의 유니코드 문자 (코드 포인트 0xhhhh) |
INI 파일은 초기에 Windows에서 소프트웨어 구성의 주된 메커니즘으로 사용된 텍스트 파일 형식이었다. 각 줄에 키-값 쌍이 하나씩 포함되고 여러 섹션으로 구성되는 형태를 가졌다. 이 형식은 장치 드라이버, 글꼴, 시작 관리자와 같은 운영 체제 구성 요소뿐만 아니라, 응용 프로그램의 개별 설정을 저장하는 데에도 일반적으로 사용되었다.[3]
가상의 프로그램을 위한 INI 파일 예시는 아래와 같다. 이 파일은 두 개의 섹션, 즉 소프트웨어 소유자 정보를 담은 `[owner]` 섹션과 데이터베이스 연결 정보를 담은 `[database]` 섹션으로 나뉜다. 각 섹션 아래에는 `=` 기호로 키(key)와 값(value)을 연결하여 프로그램 설정을 정의한다.
Windows에서는 '프로필 API'(Profile API)라는 프로그래밍 인터페이스를 사용하여 고전적인 `.ini` 파일의 설정을 읽고 쓸 수 있다. 예를 들어, [https://msdn.microsoft.com/en-us/library/ms724353(VS.85).aspx `'GetPrivateProfileString'`] 함수는 초기화 파일의 지정된 섹션에서 문자열을 검색하는 데 사용된다. 여기서 "private" 프로필은 시스템 전체 설정 파일인 WIN.INI에서 값을 가져오는 `'GetProfileString'` 함수와 구분된다.
Windows에서는 '프로필 API'(Profile API)라는 프로그래밍 인터페이스를 사용하여 `.ini` 파일에서 설정을 읽고 쓴다. 예를 들어, `GetPrivateProfileString` 함수는 지정된 초기화 파일의 특정 섹션에서 문자열을 검색한다. 이는 시스템 전역 설정 파일인 WIN.INI에서 값을 가져오는 `GetProfileString` 함수와는 구별된다.[22][23] C 언어에서는 Windows API의 `GetPrivateProfileString` 함수로 문자열 값을, `GetPrivateProfileInt` 함수로 정수 값을 읽을 수 있다. 이 함수들은 파일 경로, 섹션 이름, 키 이름, 그리고 키가 없을 경우 반환될 기본값을 인수로 받는다. `GetPrivateProfileString`에서 기본값 인수로 `NULL`이 주어지면 빈 문자열("")이 기본값이 된다. 값을 쓸 때는 `WritePrivateProfileString` 함수를 사용하며, 정수 값을 직접 쓰는 함수(`WritePrivateProfileInt`)는 없다.
초기화 파일 매핑은 INI 파일과 윈도우 레지스트리 사이에 매핑을 생성하는 기능이다.[51][52] 이 기능은 기존에
윈도우 95부터 마이크로소프트는 INI 파일 대신 윈도우 레지스트리 사용을 적극적으로 권장하기 시작했다.[53] INI 파일은 일반적으로 구성 단계가 섹션과 속성의 두 단계로 제한되며 바이너리 데이터를 제대로 처리하기 어렵다는 한계가 있었다. 그러나 레지스트리로의 전환 결정은 레지스트리가 단일하고 내용을 파악하기 어려운 바이너리 형식이며, 파일 시스템과 동기화되어야 하고, 운영 체제 전체에 영향을 미칠 수 있는 단일 실패 지점이 될 수 있다는 점에서 비판을 받기도 했다.[54]
[1]
웹사이트
Microsoft TechNet: Configure an Ini File Item
https://technet.micr[...]
: 단, 모든 구현체가 동일한 이스케이프 시퀀스를 지원하는 것은 아니므로 주의가 필요하다.
3. 역사
Windows 3.1 이전에는 `WIN.INI`라는 INI 파일이 유일하게 존재했지만, Windows 3.1부터는 애플리케이션별 INI 파일이 사용되기 시작하면서 이를 `WIN.INI`와 구별하여 개인 프로파일 파일이라고 부르기도 했다. 이 형식은 Windows 3.1x까지 16비트 Microsoft Windows 플랫폼에서 널리 사용되었다. 그러나 Windows 95 출시 이후 Microsoft는 Windows 레지스트리 사용을 선호하게 되었고, 개발자들에게 INI 파일 대신 레지스트리를 사용하도록 권장하기 시작했다. 이후 모든 Windows 버전은 시스템 구성을 위해 Windows 레지스트리를 사용하게 되었으며, .NET Framework를 기반으로 하는 응용 프로그램들은 XML 형식의 `.config` 파일을 주로 사용한다. 그럼에도 불구하고 초기화 파일 기능 자체는 여전히 Windows에서 제공되며 개발자들은 필요에 따라 계속 사용할 수 있다.
Windows API에는 INI 파일을 처리하기 위한 C 언어 형식의 함수들(예: `GetPrivateProfileString`, `WritePrivateProfileString`)이 표준으로 구현되어 있다. 이 함수들은 Win16과의 호환성을 위해 남아있는 것이며, Win32 이후 환경에서는 레지스트리나 XML 파일 등을 이용한 설정 관리가 권장되고 INI 파일 사용은 권장되지 않는다.[62] 이 API 함수들은 ANSI 멀티바이트 문자 집합(MBCS)용과 유니코드용 버전이 모두 존재하지만, 기본적으로 생성되는 INI 파일의 텍스트 인코딩은 시스템 로캘 설정에 의존하는 ANSI MBCS이다.
Windows 환경 외에서도 플랫폼 독립적인 소프트웨어나 일부 Unix 계열 시스템의 구성 파일 형식으로 INI 파일 또는 유사한 형식이 사용된다. INI 파일은 사람이 읽을 수 있고 구문 분석이 비교적 간단하기 때문에, 복잡한 구조가 필요하지 않은 구성 파일에 유용한 형식으로 평가받는다.
다음은 INI 파일 형식이 사용되는 몇 가지 예시이다.파일 경로/이름 설명 관련 기술/시스템 ``Desktop.ini`` 폴더 아이콘 지정 등 디렉토리 속성 구성 Windows [4][5] ``php.ini`` PHP 설정 구성 PHP [6][7] ``.git/config`` Git 저장소 설정 Git [8] ``*.desktop`` freedesktop.org 데스크톱 항목 freedesktop.org [9] ``*.service`` systemd 유닛 구성 systemd [10] ``afp.conf`` Netatalk 구성 Netatalk [11] ``pacman.conf`` Pacman 패키지 관리자 설정 Arch Linux (Pacman) [12]
또한, Windows용 소프트웨어 설치 설정 파일(`.inf`) 등도 INI 형식에서 파생된 형식을 사용한다.[63]
4. 사용 예시
세미콜론(;)으로 시작하는 줄은 주석으로 처리되어 프로그램 실행에는 영향을 주지 않으며, 파일 수정 이력이나 특정 설정값에 대한 부가 설명을 기록하는 데 사용된다. 아래 예시에서는 파일 최종 수정 정보와 도메인 이름 대신 IP 주소를 사용한 이유가 주석으로 명시되어 있다.
; 홍길동이 2001년 4월 1일에 마지막으로 수정하였음
[owner]
name=홍길동
organization=최고의 제품
[database]
server=192.0.2.62 ; 네트워크 이름 변환(DNS)이 동작하지 않는 경우 IP 주소를 사용한다
port=143
file="payroll.dat"
5. INI 파일 접근
다음은 C 언어를 사용하여 위에서 설명한 예시 INI 파일(`dbsettings.ini`로 가정)에서 속성 값을 읽는 간단한 프로그램 예시이다.
```c
#include
int main() // _TCHAR 관련 부분은 현대 C 표준에 맞게 단순화
{
char dbserver[1000]; // TCHAR 대신 char 사용 예시
int dbport;
// ".\\dbsettings.ini" 파일의 [database] 섹션에서 "server" 키의 값을 읽음.
// 키가 없거나 파일이 없으면 기본값 "127.0.0.1"을 사용.
GetPrivateProfileStringA("database", "server", "127.0.0.1", dbserver, sizeof(dbserver), ".\\dbsettings.ini");
// ".\\dbsettings.ini" 파일의 [database] 섹션에서 "port" 키의 값을 정수로 읽음.
// 키가 없거나 파일이 없으면 기본값 143을 사용.
dbport = GetPrivateProfileIntA("database", "port", 143, ".\\dbsettings.ini");
// 참고: 정수 값을 직접 쓰는 WritePrivateProfileInt 함수는 없으며,
// 숫자를 문자열로 변환하여 WritePrivateProfileString 함수를 사용해야 함.
return 0;
}
```
`'GetPrivateProfileString'` 함수의 세 번째 매개변수는 해당 키가 파일에 없을 경우 사용될 기본값이다. 위 예시에서는 각각 `'127.0.0.1'`과 `143`이 기본값으로 사용되었다. 만약 이 매개변수에 `'NULL'`을 전달하면 기본값은 빈 문자열(`''`)이 된다.
유닉스 계열 운영체제에서는 INI 파일에 접근하기 위한 다양한 구성 라이브러리가 존재한다. 이러한 라이브러리들은 종종 특정 프레임워크나 툴킷에 이미 포함되어 있기도 하다. Unix 환경에서 사용되는 INI 파서 라이브러리의 예로는 GLib([https://developer.gnome.org/glib/stable/glib-Key-value-file-parser.html Key-value file parser]), [https://gitlab.com/iniparser/iniparser iniparser], [https://github.com/madmurphy/libconfini libconfini] 등이 있다.
Windows 환경의 변화를 살펴보면, Windows 3.1 이전에는 WIN.INI라는 단일 INI 파일이 주로 사용되었지만, Windows 3.1부터는 각 애플리케이션이 자신만의 INI 파일을 사용하는 것이 일반화되면서 이를 WIN.INI와 구분하여 '개인 프로파일 파일'이라고 부르기 시작했다.
INI 파일을 처리하기 위한 인터페이스는 C 언어 형식의 함수로 윈도우 API에 표준으로 구현되어 있다. 하지만 이 함수들은 주로 Win16 시절과의 호환성을 위해 남아 있는 것이며, Win32 이후의 환경에서는 레지스트리나 XML 파일을 이용한 설정 관리가 더 권장되고 INI 파일 사용은 권장되지 않는다[62].
INI 파일 읽기 및 쓰기를 위한 대표적인 Windows API 함수는 다음과 같다. 이 함수들은 ANSI 멀티바이트 문자 집합(MBCS)을 위한 A 버전(예: `'GetPrivateProfileStringA'`)과 유니코드 문자 집합을 위한 W 버전(예: `'GetPrivateProfileStringW'`)으로 나뉘어 제공된다. 그러나 어떤 버전을 사용하든 기본적으로 INI 파일은 시스템 로케일 설정에 따른 ANSI 인코딩으로 저장된다.기능 함수명 (A/W 버전 존재) 설명 값 읽기 (문자열) [https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-getprivateprofilestring `GetPrivateProfileString`] 지정된 섹션에서 문자열 값을 검색한다. 키가 없을 경우 사용할 기본값을 지정할 수 있다. 값 읽기 (정수) `GetPrivateProfileInt` 지정된 섹션에서 정수 값을 검색한다. 키가 없을 경우 사용할 기본값을 지정할 수 있다. 값 쓰기 (문자열) `WritePrivateProfileString` 지정된 섹션에 문자열 값을 쓴다. 정수 값을 쓰려면 문자열로 변환 후 이 함수를 사용해야 한다.
Windows용 소프트웨어의 설치 설정 파일(`.inf`) 등도 INI 파일 형식을 기반으로 한 파생 형식이다[63].
6. INI 파서 비교
Unix 계열 운영체제에도 INI 파일 접근을 위한 다양한 설정 라이브러리가 있으며, 종종 프레임워크나 툴킷에 포함되어 있다. 대표적인 Unix용 INI 파서로는 GLib(Key-value file parser), [https://gitlab.com/iniparser/iniparser iniparser], [https://github.com/madmurphy/libconfini libconfini] 등이 있다.
다양한 프로그래밍 언어와 라이브러리에서 제공하는 INI 파서들은 기능과 특징에서 차이를 보인다. 주요 파서 비교는 다음과 같다.이름 섹션 지원 섹션 중첩 지원 비활성화된 항목 인식[22] 여러 줄 지원[23] 값 유형 읽기/쓰기 지원 플랫폼 라이선스 프로그래밍 언어 최신 릴리스 버전 Python ConfigParser[24][25] O O X 부분 (비표준)[26] 불리언, 숫자, 문자열 읽기 + 쓰기 *BSD, 리눅스, macOS, Windows PSFL C (구현), Python (사용) 3.9.7[27] GLib[28] O O X X 불리언, 숫자, 문자열, 배열 읽기 + 쓰기 *BSD, 리눅스, macOS, Windows LGPL C 최신 안정 버전[29] inifile[30] O X X X 불리언, 숫자, 문자열 읽기 + 쓰기 *BSD, 리눅스, macOS, Windows Apache Go 1.2.0[31] inih[32] O X X 부분 (비표준)[33] 불리언, 숫자, 문자열 읽기 *BSD, 리눅스, macOS, Windows BSD C 53[34] iniparser[35] O X X O 불리언, 숫자, 문자열 읽기 + 쓰기 *BSD, 리눅스, macOS, Windows MIT C 4.2.4[36] Java (`java.util.Properties`)[37] X X X O 문자열 읽기 + 쓰기 플랫폼 독립적 이중 라이선스: GPL v2 (클래스패스 예외 포함)[38], 독점[39] C (구현), Java (사용) 최신 안정 버전 libconfini[40] O O O O 불리언, 숫자, 문자열, 배열 읽기 *BSD, 리눅스, macOS, Windows GPL C 1.16.2[41] PHP (`parse_ini_file()`)[42] O O O X 숫자, 문자열, Null 읽기 리눅스, macOS, Windows PHP 라이선스 v3.01[43] C (구현), PHP (사용) 최신 안정 버전 [https://gitlab.com/whoatemybutter/pyini PyINI][44] O X O O 불리언, 숫자, 문자열 읽기 + 쓰기 플랫폼 독립적 GPL Python 1.0[45] [https://github.com/ldthomas/python-ini python-ini][46] O X X O 불리언, 숫자, 문자열, Null 읽기 + 쓰기 플랫폼 독립적 BSD Python 1.1.0 RudeConfig[47] O X X X 불리언, 숫자, 문자열 읽기 + 쓰기 리눅스, Windows GPL C++ 중단됨 (2009년 11월, 5.0.5)[48] Windows API O X X X 숫자, 문자열, 구조체 읽기 + 쓰기 (비파괴적) Windows 독점 C 최신 안정 버전 Wine (Windows API 구현) O X X X 숫자, 문자열, 구조체 읽기 + 쓰기 (비파괴적) 리눅스, macOS, Windows LGPL C 최신 안정 버전 Rust configparser[49] O X X X 불리언, 숫자, 문자열 읽기 + 쓰기 *BSD, 리눅스, macOS, Windows MIT 또는 LGPL v3.0+ Rust 3.0.2[49] java-ini-parser[50] O X O O 불리언, 숫자, 문자열 읽기 + 쓰기 플랫폼 독립적 Apache Java 1.4[50]
7. 파일 매핑
.ini 파일을 사용하던 설정을 새로운 방식인 레지스트리로 옮기기 위해 윈도우 NT와 윈도우 95에서 도입되었다. 파일 매핑은 프로그램이 INI 파일을 읽거나 쓰려고 할 때(프로파일 API 호출) 이를 가로채서, 레지스트리의 ''IniFileMapping'' 섹션에 저장된 설정을 참조하여 실제 읽기 및 쓰기 작업을 레지스트리의 지정된 위치로 대신 수행하도록 지시한다.
예를 들어, 아래와 같은 코드를 사용하여 c:\programs\oldprogram\dbsettings.ini 파일의 [owner] 섹션 아래에 있는 name 키의 값을 문자열로 가져오려 한다고 가정해보자. 기대하는 반환 값은 "John Doe"이다.
: GetPrivateProfileString("owner", "name", ... , "c:\\programs\\oldprogram\\dbsettings.ini");
INI 매핑은 이 API 호출을 받으면, 코드에 명시된 파일 경로(c:\programs\oldprogram\dbsettings.ini)를 무시하고, 대신 다음 레지스트리 경로에서 해당 파일 이름(dbsettings.ini)과 일치하는 키가 있는지 확인한다.
: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\IniFileMapping
만약 이 경로에 dbsettings.ini 키가 존재한다면, 그 안에서 API 호출 시 요청된 섹션 이름(owner)과 일치하는 항목 이름을 찾는다. 해당 항목이 발견되면, INI 매핑은 그 항목의 값을 레지스트리 내 다른 위치를 가리키는 포인터로 사용한다. 그리고 최종적으로 그 포인터가 가리키는 레지스트리 위치에서 요청된 INI 설정값(name)을 찾는다.
만약 요청된 섹션 이름과 정확히 일치하는 항목이 없고 ''(Default)''라는 이름의 항목이 존재한다면, INI 매핑은 이 기본 항목을 대신 사용한다. 따라서 모든 섹션 이름에 대해 개별적인 항목을 만들 필요는 없다.
아래는 IniFileMapping 아래의 dbsettings.ini 키에 설정된 값의 예시이다.항목 이름 값 (Default) @USR:Software\oldprogs\inisettings\all database USR:Software\oldprogs\inisettings\db
위 설정에 따라, 앞서 예시로 든 ''(Default)'' 항목의 값인 @USR:Software\oldprogs\inisettings\all 경로로 매핑된다. 이 경로는 실제 사용자별 레지스트리 위치인 HKEY_CURRENT_USER\Software\oldprogs\inisettings\all을 가리킨다. 해당 위치의 내용은 아래와 같다고 가정하자.항목 이름 값 name John Doe organization Acme Products
여기서 ''name'' 레지스트리 항목 이름이 API 호출에서 요청한 INI 키(name)와 일치하므로, 이 항목의 값인 "John Doe"가 최종적으로 API 호출의 결과로 반환된다. 이 경우, ''(Default)'' 항목 값 앞에 붙은 @ 접두사는 중요한 의미를 가진다. 이 접두사는 레지스트리에서 해당 설정을 찾지 못했을 때, 원래의 dbsettings.ini 파일에서 값을 읽어오는 것을 방지한다. 즉, 레지스트리에 없는 설정은 INI 파일에서도 찾지 않게 된다.
반면, 위 표의 ''database'' 레지스트리 항목 값에는 @ 접두사가 없다. 이는 [database] 섹션에 대한 설정 요청의 경우, 먼저 레지스트리(USR:Software\oldprogs\inisettings\db 경로)에서 값을 찾고, 만약 레지스트리에 해당 값이 없다면 그 다음에 디스크 상의 원본 dbsettings.ini 파일에서 값을 찾아 사용한다는 것을 의미한다.
8. 대안
이후 XML 기반의 설정 파일이 텍스트 파일에서 설정을 인코딩하는 대안으로 널리 사용되었다. XML은 임의로 복잡한 수준과 중첩 구조를 허용하며, 이진 데이터를 인코딩하기 위한 표준화된 방법을 제공한다.
최근에는 데이터 직렬화 형식인 JSON, TOML, YAML 등이 설정 파일 형식으로 사용될 수 있다. 이 세 가지 형식은 임의로 중첩된 구조를 표현할 수 있지만, INI 파일과는 다른 구문 규칙을 따른다. 이 중에서 TOML은 INI와 가장 유사한 구조를 가지지만, TOML을 INI 파일 형식과 호환되도록 만들려던 초기 아이디어는 받아들여지지 않았다.[55]
참조
[2]
웹사이트
.conf initialization files
http://www.fileinfo.[...]
[3]
웹사이트
Microsoft: Windows NT Workstation Resource Kit
https://www.microsof[...]
[4]
웹사이트
How to Customize Folders with Desktop.ini
https://learn.micros[...]
2024-01-10
[5]
뉴스
Why Are There Two Desktop.ini Files On My Desktop & What Do They Do?
https://www.digitalc[...]
Codrut Neagu
[6]
서적
Programming PHP
https://books.google[...]
[7]
서적
PHP and MySQL Phrasebook
https://books.google[...]
[8]
웹사이트
git-config CONFIGURATION FILE
https://git-scm.com/[...]
[9]
웹사이트
Basic format of the file
https://specificatio[...]
[10]
웹사이트
systemd.service
https://www.freedesk[...]
[11]
웹사이트
afp.conf — Netatalk configuration file
https://netatalk.sou[...]
2024-01-10
[12]
웹사이트
pacman.conf(5)
https://archlinux.or[...]
[13]
웹사이트
libconfini's Library Function Manual
https://madmurphy.gi[...]
[14]
웹사이트
Apache Documentation for org.apache.commons.configuration2.INIConfiguration
http://commons.apach[...]
The Apache Software Foundation
[15]
웹사이트
GetPrivateProfileString function
http://msdn.microsof[...]
Microsoft
2012-06-02
[16]
웹사이트
config.txt
https://git.kernel.o[...]
2024-01-10
[17]
웹사이트
config.txt
https://git.kernel.o[...]
2024-01-10
[18]
웹사이트
config.txt
https://git.kernel.o[...]
2024-01-10
[19]
문서
Cloanto Implementation
[20]
웹사이트
config.txt
https://git.kernel.o[...]
2024-01-10
[21]
웹사이트
config.txt
https://git.kernel.o[...]
2024-01-10
[22]
문서
'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:{{Pre|[section]
#a{{=}}a
b{{=}}b}}'
[23]
문서
The standard syntax for line continuation refers here to the sequence of a [[backslash]] followed by [[Newline|line break]], as implemented by [[iniparser]], [[libconfini]] and java.util.Properties
[24]
서적
Python Standard Library
https://books.google[...]
2001
[25]
웹사이트
ConfigParser - Configuration file parser
https://docs.python.[...]
[26]
문서
Following the syntax of the language it is designed to work with ([[Python (programming language)|Python]]), to span a node over multiple lines ConfigParser requires a deeper [[Indentation style|indentation]] in the lines that follow, instead of the more common [[backslash]] + [[Newline|line break]] (see: [https://docs.python.org/3/library/configparser.html#supported-ini-file-structure configparser — Configuration file parser])
[27]
웹사이트
Python Documentation by Version
https://www.python.o[...]
[28]
웹사이트
GLib Key–value file parser
https://developer.gn[...]
[29]
웹사이트
Releases · GNOME/glib
https://github.com/G[...]
[30]
웹사이트
inifile documentation
https://github.com/g[...]
[31]
웹사이트
Releases · inifile
https://github.com/g[...]
[32]
웹사이트
inih README
https://github.com/b[...]
[33]
문서
Using indentation, explicitly following ConfigParser's approach (see the project's documentation for more information)
[34]
웹사이트
Releases · benhoyt/inih
https://github.com/b[...]
[35]
웹사이트
iniparser documentation
https://iniparser.gi[...]
[36]
웹사이트
Releases · iniparser/iniparser
https://gitlab.com/i[...]
[37]
웹사이트
Properties (Java Platform SE 8)
https://docs.oracle.[...]
[38]
웹사이트
OpenJDK: GPLv2 + Classpath Exception
https://openjdk.java[...]
Openjdk.java.net
1989-04-01
[39]
웹사이트
BCL For Java SE
https://www.oracle.c[...]
Oracle.com
2013-04-02
[40]
웹사이트
libconfini documentation
https://madmurphy.gi[...]
[41]
웹사이트
Releases · madmurphy/libconfini
https://github.com/m[...]
[42]
웹사이트
parse_ini_file() — Parse a configuration file
https://www.php.net/[...]
2022-07-19
[43]
웹사이트
PHP License v3.01
https://www.php.net/[...]
[44]
웹사이트
PyINI
https://gitlab.com/w[...]
[45]
웹사이트
Tags · whoatemybutter / PyINI
https://gitlab.com/w[...]
[46]
웹사이트
python-ini
https://github.com/l[...]
[47]
웹사이트
RudeConfig documentation
http://rudeserver.co[...]
[48]
웹사이트
Releases · RudeConfig
http://rudeserver.co[...]
[49]
웹사이트
configparser on crates.io
https://crates.io/cr[...]
2022-12-12
[50]
웹사이트
java-ini-parser github page
https://github.com/v[...]
[51]
간행물
Initialization Files and the Registry
https://technet.micr[...]
Microsoft TechNet
[52]
서적
Administering the NT Registry
http://oreilly.com/c[...]
O'Reilly Media
[53]
웹사이트
The System Registry
https://msdn.microso[...]
[54]
웹사이트
Was The Windows Registry a Good Idea? – Coding Horror
https://blog.codingh[...]
[55]
웹사이트
Comment on ".INI compatibility is a worthy goal" issue on GitHub
https://github.com/t[...]
[56]
웹사이트
libconfini/README
https://github.com/m[...]
[57]
웹사이트
INIファイル 【INI file】 .iniファイル
https://e-words.jp/w[...]
IT用語辞典
2022-02-04
[58]
웹사이트
db2cli.ini 初期設定ファイル - IBM Documentation
https://www.ibm.com/[...]
[59]
웹사이트
GetPrivateProfileSection function (winbase.h) - Win32 apps | Microsoft Docs
https://docs.microso[...]
[60]
웹사이트
プロパティ拡張情報ファイル
http://itdoc.hitachi[...]
[61]
웹사이트
GetPrivateProfileString function (winbase.h) - Win32 apps | Microsoft Docs
https://docs.microso[...]
[62]
웹사이트
Why are INI files deprecated in favor of the registry? | The Old New Thing
https://devblogs.mic[...]
[63]
웹사이트
General Syntax Rules for INF Files - Windows drivers | Microsoft Docs
https://docs.microso[...]
[64]
웹사이트
.conf initialization files
http://www.fileinfo.[...]
[65]
웹사이트
Other .conf initialization files
https://www.google.c[...]
[66]
문서
See Trainz/Config.txt Files which uses config.txt for virtually all data base assets. (Trainsoptions.txt is that app's version of a .ini file)
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com