| ファイル名拡張子 |
.ini |
|---|---|
| インターネットメディアの種類 |
テキスト/プレーン、アプリケーション/テキストエディット、zz-application/zz-winassoc-ini |
| フォーマットの種類 | 初期化/構成ファイル |
INIファイルは、セクションに整理されたキーと値のペアで構成される構造と構文を持つプレーンテキストで構成されるコンピュータソフトウェアの構成ファイルです。 [1]これらの構成ファイルの名前は、ファイル名拡張子INI (初期化の略)に由来しており、このソフトウェア構成方法を普及させたMS-DOSオペレーティングシステムで使用されていました。この形式は、多くの構成コンテキストで非公式の標準となっていますが、他のオペレーティングシステム上の多くのアプリケーションでは、 confやcfgなどの異なるファイル名拡張子が使用されています。[2]
歴史
Windowsにおけるソフトウェア構成の主なメカニズムは、もともとテキスト ファイル形式で、1 行に 1 つのキーと値のペアが含まれたテキスト行がセクションにまとめられていました。この形式は、デバイス ドライバー、フォント、スタートアップ ランチャーなどのオペレーティング システム コンポーネントに使用されていました。INI ファイルは、アプリケーションによって個別の設定を保存するためにも一般的に使用されていました。[3]
この形式は、 Windows 3.1xまでの16 ビットMicrosoft Windowsプラットフォームで維持されていました。Windows 95以降、 Microsoft はWindows レジストリの使用を推奨し、開発者が構成に INI ファイルを使用しないように誘導し始めました。それ以降のすべての Windows バージョンでは、システム構成に Windows レジストリが使用されていますが、.NET Framework 上に構築されたアプリケーションでは、特別なXML .configファイルが使用されます。初期化ファイル関数は Windows で引き続き使用可能であり、開発者は引き続き使用できます。
Windows ソフトウェア以外にも、プラットフォームに依存しないソフトウェアがこのファイル形式を構成に使用することがあります。一部のUnix 系構成ファイルも同様の形式を使用します。INI は人間が判読でき、解析も簡単なので、それほど複雑ではない構成ファイルには使用できる形式です。
有病率
以下は、INI ファイルが出現する場所の非網羅的なリストです。
Desktop.iniWindowsでは、ディレクトリのプロパティを設定するために、例えばフォルダのアイコンを指定するために、ファイルが今でも使用されています。[4] [5]- PHPの
php.iniファイルはINI形式を採用しています。[6] [7] - Gitの
.git/configファイルはINI形式で書かれています。[8] - freedesktop.orgの
*.desktopエントリはINI形式で書かれています。[9] - systemd
*.serviceユニット設定ファイルはINIに書き込まれます。[10] - Netatalkの
afp.confファイルはINIスタイルの設定言語で書かれています。[11] - Pacmanの
pacman.confファイルはINI形式で書かれています。[12]
例
次のサンプル ファイルには、ソフトウェアの所有者用と給与データベース接続用の 2 つのセクションがあります。コメントには、ファイルを最後に変更したユーザーと変更理由が記録されます。
; 最終更新日: 2001 年 4 月 1 日、John Doe
[所有者]
氏名= John Doe、組織= Acme Widgets Inc.
[データベース]
; ネットワーク名解決が機能していない場合は IP アドレスを使用します。
サーバー= 192.0.2.62ポート= 143ファイル= "payroll.dat"
形式
より広い意味では、INI は、人間が設定できるまま、アドホック実装に適した非公式の形式です。その結果、INI 方言と呼ばれるさまざまな仕様 (パーサー実装が唯一の仕様として記述される場合もあります) が多数存在します。
INI の解釈は、空白の保持、フィールド タイプ情報、大文字と小文字の区別、または推奨されるコメント区切り文字など、個人の好みやコンピューティング環境のニーズに大きく依存します。このため、INI は増殖しがちです。とはいえ、INI 風の実装は通常、共通の設計機能を共有しています。つまり、各行にキーと値のペアが等号で区切られ、角括弧で示されるセクションに整理されたテキスト ファイルです。
できるだけ多くの方言をサポートできるパーサーを作成しようとする試みは存在しており、[13]最も複雑な解釈では、INI形式は任意のS式を表現できるため、 XMLやJSONなどの標準化された形式と同等になりますが、構文は固定されておらず、一部の人にとってはより快適に感じるかもしれません。
INI ファイル形式は厳密に定義されていないため、多くのパーサーは共通コアを構成する機能を超えた機能をサポートしています。実装されたサポートは非常に不安定です。
キーと値のペア
INI 内のデータは、キーまたはプロパティと呼ばれるキーと値のペアで保持されます。したがって、キーはキーと値のペア全体を指すことも、そのキーのみを指すこともできます。値はプロパティ名とも呼ばれます。テキスト表現では、キーと値のペアは行または複数行で表され、値の開始は区切り文字で示されます。区切り文字は、ほとんどの場合等号( =、ASCII 0x3D) ですが、コロン ( :、ASCII 0x3A) や空白文字 (GNU の世界では時々使用されます[13] ) の場合もあります。キーのキーは区切り文字の左側に表示され、空でないことが多く、区切り文字を含んではいけません。一部のフレーバーでは、値にエスケープ シーケンスを使用できます。
Windows 実装では、等号とセミコロンは予約文字であり、キーには使用できません。キーを囲む空白はパーサーによって削除されます。値には任意の文字を含めることができます (Windows スタイルでは、区切り文字を空白で囲みません: 例IconFile=Folder.ico)。
キーと値のペアは、テキストで次のように表現されます。
キー=キー = v
名前=値sem = ; semver = v5822.433.2
セクション
キーと値のペアは、セクションの下にグループ化できます。一部の INI 方言では、すべてのキーと値のペアがセクション内にある必要があり、一部の方言では、いわゆるグローバル プロパティが許可されます。[14]キーと値のペアがグループ化されている場合、セクション名は、角括弧( [、ASCII 0x5B、および、ASCII 0x5D)で囲まれた行に単独で表示され]、別のセクションが宣言されるまで、後続の行のすべてのキーと値のペアに適用されます。明示的な「セクションの終了」区切り文字はありません (たとえば、XML の など</tag>)。したがって、セクションは構文上、任意にネストすることはできません。必要な場合は、階層をフラット化し、セクション名内にカスタム区切り文字 (多くの場合 、ASCII 0x2E) を連結することで、ネストを実装できます.。多くの場合、サブセクションと呼ばれる 1 レベルのネストがサポートされます。
ネストされたセクションを使用する INI ドキュメントの例:
[プロジェクト]
名前=果樹園レンタルサービス (アプリ付き)対象地域= 「ベイエリア」; TODO: 空きポジションを広告する法務チーム= (空き)
[果物「リンゴ」]
商標問題=予見可能な味=既知
[fruit.Date]
味=斬新商標問題= 「本当にあり得ない」
[果物「ラズベリー」]
予想される問題= 「物流(壊れやすい果物)」商標の問題= \
可能
[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]ほとんどのUnixスタイルのINI解釈では大文字と小文字の区別が完全に禁止されていますが、セクション名[16]やキー[17]の大文字と小文字の区別は許可される場合があります。
コメント
連続する末尾の空白文字の後にセミコロン( 、ASCII 0x3E) が続く行は、コメント を;示します。一部の INI 方言では、さらに、 Unixシェルのコメントと同様に、コメントを示すために番号記号( 、ASCII 0x23) を使用できます。すべての INI 方言ではありませんが、一部の INI 方言では、キーと値のペアの行またはセクション行にコメント (インライン コメントと呼ばれる) を使用できます。その場合、値またはセクションの閉じ括弧とコメントを区切る空白文字が必要なものもあります。それでも、一部の方言では、番号記号がキー名に含まれ、無視される場合があります。コメント行は、パーサーによって無視されるように設計されています。
#
#! /bin/convert-ini-to-perl | perl | ssh wikipedia.org upload --sanitise=no
; INI 方言の知識がないと曖昧です:
; 値は "live" ですか、それとも "live # dangerously" ですか?
= live # dangerouslyにしたいです
#var = a
var = a ; これはインラインコメントですfoo = bar # これは別のインラインコメントです
WinAPIのGetPrivateProfileStringの方言 では、コメントは行ごとに記述する必要があります。
セクションとプロパティの順序
セクション内のプロパティの順序とファイル内のセクションの順序は無関係です。
重複した名前
ほとんどの実装では、セクション内に特定の名前を持つプロパティを 1 つだけ持つことができます。プロパティ名が 2 回目に出現すると、中止が発生するか、無視される (値が破棄される) か、最初の出現が上書きされる (最初の値が破棄される) 可能性があります。一部のプログラムでは、重複したプロパティ名を使用して複数値プロパティを実装します。
同じ名前を持つ複数のセクション宣言の解釈も異なります。一部の実装では、重複したセクションは、連続して発生したかのように、そのプロパティを単純に結合します。他の実装では、中止したり、INI ファイルの一部の側面を無視したりする場合があります。
引用符で囲まれた値
一部の実装では、通常は二重引用符やアポストロフィを使用して値を引用符で囲むことができます。これにより、空白を明示的に宣言したり、特殊文字 (等号、セミコロンなど) を引用符で囲んだりすることができます。標準の Windows 関数 GetPrivateProfileString はこれをサポートしており、値を囲む引用符を削除します。
行の継続
C言語の構文をエミュレートして、一部の方言では、行の最後の文字としてバックスラッシュ(ASCII 0x5C)を使用することで行の折り返しを許可しています。[18] このような行の継続では\、バックスラッシュの直後にEOL(行末)が続くと、バックスラッシュと改行が削除され、文書の行が論理行に変換されます。
エスケープ文字
いくつかの方言では、文字エスケープのさまざまなサポートが提供されており、通常はバックスラッシュ文字(\、ASCII 0x5C)をメタ文字として使用し、C構文をエミュレートします。[19]
いくつかの仕様では一般的なエスケープシーケンスのメタ文字を明示的にミュートしているため、エスケープシーケンスを盲目的に解釈するのは賢明ではありません。[20] [21]
INIファイルへのアクセス
Windows では、プロファイル API は、従来の Windows ファイルから設定を読み書きするために使用されるプログラミング インターフェイスです。たとえば、GetPrivateProfileString 関数は、初期化ファイル内の指定されたセクションから文字列を取得します。(「プライベート」プロファイルは、 WIN.INIから取得する と.iniは対照的です。)
GetProfileString
次のサンプルCプログラムは、上記のサンプル INI ファイル (構成ファイルの名前を としますdbsettings.ini) からプロパティ値を読み取る方法を示しています。
#include <windows.h>
int main ( int argc , _TCHAR * argv [])
{
_TCHAR dbserver [ 1000 ];
整数dbポート;
GetPrivateProfileString ( "データベース" 、"サーバー" 、"127.0.0.1" 、dbserver 、sizeof ( dbserver ) / sizeof ( dbserver [ 0 ] )、". \\ dbsettings.ini" );
dbport = GetPrivateProfileInt ( "データベース" 、"ポート" 、143 、". \\ dbsettings.ini" );
// 注意: WritePrivateProfileInt() は存在せず、WritePrivateProfileString() のみ存在します
0 を返します。
}
関数の 3 番目のパラメータはGetPrivateProfileStringデフォルト値で、上記の 2 つの関数呼び出しではそれぞれ と です"127.0.0.1"。143このパラメータに指定された引数が の場合NULL、デフォルトは空の文字列 になります""。
Unix では、INI ファイルにアクセスするためのさまざまな設定ライブラリが存在します。これらは多くの場合、フレームワークやツールキットにすでに含まれています。Unix の INI パーサーの例としては、GLib、iniparser、libconfini などがあります。
INIパーサーの比較
ファイルマッピング
初期化ファイル マッピングは、INI ファイルとWindows レジストリ間のマッピングを作成します。[60] [61]これは、従来のファイルに設定を保存する方法から新しいレジストリに移行する方法として、Windows NT および Windows 95 で導入されました。ファイル マッピングは、プロファイル API 呼び出しをトラップし、 IniFileMapping.iniレジストリ セクションの設定を使用して、読み取りと書き込みをレジストリ内の適切な場所に誘導します。
以下の例を使用すると、文字列呼び出しを行って、たとえば という設定ファイルの所有者セクションから名前キーを取得できます。返される値は文字列「John Doe」になります。
dbsettings.ini
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" の値がプロファイル呼び出しに返されます。この場合、デフォルトの @ プレフィックスにより、dbsettings.iniディスク上のファイルへの読み取りが防止されます。その結果、レジストリで見つからない設定は INI ファイルで検索されません。
「database」レジストリ エントリの値には @ プレフィックスが付いていません。したがって、セクションのみ[database]、レジストリの設定が最初に取得され、その後にdbsettings.iniディスク上のファイルの設定が取得されます。
代替案
Windows 95以降、マイクロソフトは INI ファイルよりも Windows レジストリの使用を強く推奨し始めました。[62] INI ファイルは通常 2 つのレベル (セクションとプロパティ) に制限されており、バイナリ データをうまく処理できません。しかし、この決定は、レジストリがモノリシックで不透明でバイナリであり、ファイル システムと同期する必要があり、オペレーティング システムの単一障害点となるという事実により、批判を免れていません。 [63]
その後、XMLベースの構成ファイルは、テキスト ファイルで構成をエンコードするための一般的な選択肢になりました。[引用が必要] XML では、任意の複雑なレベルとネストが可能で、バイナリ データをエンコードするための標準的なメカニズムがあります。
最近では、JSON、TOML、YAMLなどのデータシリアル化形式が設定形式として使用できます。これらの3つの代替形式は任意にネストできますが、INIファイルとは構文が異なります。その中でもTOMLはINIに最も似ていますが、TOMLをINIの大きなサブセットと意図的に互換性を持たせるというアイデアは却下されました。[64]
しかし、最新のINIパーサーは、 XML、JSON、TOML、YAMLの任意のレベルのネストを許可し、型指定された値とUnicodeの同等のサポートを提供しますが、同じことを表現するための複数の構文を許可することでINIファイルの「非公式な状態」を維持しています。[65]
参照
- ブートINI
- MSコンフィグ
- システムエディット
- システム.INI
- TOML、非常に似ていますが、より正式に指定された構成ファイル形式
- WIN.INI
- AmigaのIFFファイル
- .DS_ストア
- .プロパティ
参考文献
- ^ Microsoft TechNet: INI ファイル項目を構成する
- ^ .conf 初期化ファイル
- ^ Microsoft: Windows NT ワークステーション リソース キット
- ^ Microsoft Learn (2022-02-08). 「Desktop.ini を使用してフォルダーをカスタマイズする方法」 。2024年 1 月 10 日閲覧。
- ^ Codrut Neagu、「デスクトップに Desktop.ini ファイルが 2 つあるのはなぜですか? また、それらはどのような機能を果たしますか?」
- ^ Rasmus Lerdorf、Kevin Tatroe、Peter MacIntyre。「PHP プログラミング」。セクション「parse_ini_file」、「Extension INI Entries」など。
- ^
Christian Wenz. 「PHP と MySQL のフレーズ集」。セクション「INI ファイルの解析」。引用: 「... INI ファイル形式は Windows の世界では非常に広く使用されていましたが、今日では PHP などのソフトウェア製品の構成にも使用されています。たとえば、...
php.ini」 - ^ 「git-config 構成ファイル」。
- ^ 「ファイルの基本フォーマット」。specifications.freedesktop.org。
- ^ 「systemd.service」。www.freedesktop.org。
- ^ 「afp.conf — Netatalk 設定ファイル」 。2024年 1 月 10 日閲覧。
- ^ "pacman.conf(5)". archlinux.org .
- ^ abc libconfini のライブラリ関数マニュアル
- ^ org.apache.commons.configuration2.INIConfiguration の Apache ドキュメント、Apache Software Foundation
- ^ これには Windows 実装が含まれます。「GetPrivateProfileString 関数」を参照してください。Microsoft Developer Network。Microsoft。2012年 6 月 2 日取得。
- ^ Git プロジェクト。「config.txt」。2024 年 1 月 10 日閲覧。
- ^ Git プロジェクト。「config.txt」。2024 年 1 月 10 日閲覧。
- ^ Git プロジェクト。「config.txt」。2024 年 1 月 10 日閲覧。
- ^ Cloanto の実装
- ^ Git プロジェクト。「config.txt」。2024 年 1 月 10 日閲覧。
- ^ Git プロジェクト。「config.txt」。2024 年 1 月 10 日閲覧。
- ^ INI ファイルの作成者の間では、不要なエントリを完全に削除するのではなく、無効にするために「コメント アウト」するのが一般的な方法です。
a次の例のキーを参照してください。[セクション]
#a=a
b=b - ^行継続の 標準的な構文は、iniparser、 libconfini 、および
java.util.Properties - ^ フレドリック・ルンド。 「Python標準ライブラリ」。 2001。セクション「ConfigParser モジュール」。 p. 143
- ^ 「ConfigParser - 構成ファイルパーサー」。
- ^ 動作するように設計された言語 ( Python ) の構文に従い、ノードを複数行にまたがるには、ConfigParser は、より一般的なバックスラッシュ+改行ではなく、後続の行でより深いインデントを必要とします(参照: configparser — 構成ファイル パーサー)
- ^ バージョン別 Python ドキュメント
- ^ GLib キーバリューファイルパーサー
- ^ Withnall, Philip (2021年2月11日). 「glib 2.66.7」. GNOME ftp-release (メーリングリスト) . 2021年2月12日閲覧。
- ^ リリース · GNOME/glib
- ^ inifile ドキュメント
- ^ リリース · inifile
- ^ inih README
- ^ インデントを使用し、ConfigParser のアプローチに明示的に従います (詳細についてはプロジェクトのドキュメントを参照してください)
- ^ リリース · benhoyt/inih
- ^ iniparser ドキュメント
- ^ リリース · iniparser/iniparser
- ^ プロパティ (Java Platform SE 8)
- ^ 「OpenJDK: GPLv2 + クラスパス例外」。Openjdk.java.net。1989-04-01。2016-02-09に閲覧。
- ^ 「BCL For Java SE」。Oracle.com。2013-04-02。2016-02-09に閲覧。
- ^ 「Java™ SE Development Kit 23、23.0.1 リリースノート」。Oracle Corporation 。 2024年10月16日閲覧。
- ^ 「Java™ SE Development Kit 21、21.0.5 リリースノート」。Oracle Corporation 。 2024年10月16日閲覧。
- ^ 「Java™ SE Development Kit 17、17.0.13 リリースノート」。Oracle Corporation 。 2024年10月16日閲覧。
- ^ 「Java™ SE Development Kit 11、11.0.25 リリースノート」。Oracle Corporation 。 2024年10月16日閲覧。
- ^ 「Java™ SE Development Kit 8、Update 431 リリースノート」。Oracle Corporation 。 2024年10月16日閲覧。
- ^ libconfini ドキュメント
- ^ リリース · madmurphy/libconfini
- ^ PHP . 「parse_ini_file() — 設定ファイルを解析する」.公式 PHP ドキュメント. 2022 年 7 月 19 日閲覧。
- ^ PHP ライセンス v3.01
- ^ 「バージョン8.4.2」。2024年12月19日。 2024年12月22日閲覧。
- ^ ピニオン
- ^ タグ · whoatemybutter / PyINI
- ^ python-ini
- ^ RudeConfig ドキュメント
- ^ リリース · RudeConfig
- ^ 「2024 年 12 月 10 日 - KB5048667 ( OSビルド 26100.2605)」。Microsoft サポート。Microsoft 。
- ^ 「Wine 9.0 リリース」。2024年1月16日。 2024年1月16日閲覧。
- ^ abc "configparser on crates.io". crates.io . 2022-12-12. 2022-12-12時点のオリジナルよりアーカイブ。 2022-12-12に取得。
- ^ java-ini-parser github ページ
- ^ 初期化ファイルとレジストリ、Windows NT ワークステーション リソース キット、Microsoft TechNet
- ^ NT レジストリの管理、Windows NT レジストリの管理、Paul Robichaux、O'Reilly Media
- ^ システムレジストリ
- ^ Windows レジストリは良いアイデアだったのか? – Coding Horror
- ^ 「GitHub の「.INI 互換性は価値のある目標」問題に対するコメント」。GitHub。
- ^ libconfini/README
- 情報ボックス - http://filext.com/file-extension/INI
- 情報ボックス - https://wikiext.com/ini
外部リンク
- libconfini のライブラリ関数マニュアル: libconfini で許可される特定の構文。
- Cloanto の INI ファイル形式の実装: Cloanto によって実装されたパーサーによって許可される特定の構文。
- 非常にシンプルなデータ ファイル メタフォーマット: Apache Groovy の INI パーサー チュートリアル。
- Microsoft の GetPrivateProfileString() および WritePrivateProfileStringA() 関数
