INIファイル

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
INI
INIファイルicon.png
ファイル名拡張子
.ini
インターネットメディアタイプ
text / plain、application / textedit、zz-application / zz-winassoc-ini
これは初期化/構成ファイル

INIファイルは、プロパティのキーと値のペア、およびプロパティを編成するセクションで構成される構造と構文を備えたテキストベースのコンテンツで構成されるコンピュータソフトウェア構成ファイルです。[1]これらの構成ファイルの名前は、このソフトウェア構成方法を普及させたMS-DOSオペレーティングシステムで使用されている、初期化用のファイル名拡張子INIに由来しています。この形式は、構成の多くのコンテキストで非公式の標準になっていますが、他のオペレーティングシステム上の多くのアプリケーションは、confcfgなどの異なるファイル名拡張子を使用します。 [2]

歴史

Windowsのソフトウェア構成の主なメカニズムは、元々、セクションに編成された、1行に1つのキーと値のペアを持つテキスト行で構成されるテキストファイル形式でした。この形式は、デバイスドライバー、フォント、スタートアップランチャーなどのオペレーティングシステムコンポーネントに使用されていました。INIファイルは、通常、アプリケーションが個々の設定を保存するためにも使用されていました。[3]

この形式は、 Windows3.1xまでの16ビットMicrosoftWindowsプラットフォームで維持されていました。Windows 95以降、 MicrosoftはWindowsレジストリの使用を支持し、構成にINIファイルを使用しないように開発者を誘導し始めました。以降のすべてのバージョンのWindowsは、システム構成にWindowsレジストリを使用していますが、.NET Frameworkで構築されたアプリケーションは、特別なXML.configファイルを使用ます初期化ファイル関数は引き続きWindowsで使用可能であり、開発者は引き続きそれらを使用できます。

LinuxおよびUnixシステムも、システム構成に同様のファイル形式を使用します。さらに、プラットフォームに依存しないソフトウェアは、構成にこのファイル形式を使用する場合があります。人間が読める形式であり、解析も簡単であるため、それほど複雑にする必要のない構成ファイルに使用できる形式です。

Git構成ファイルはINIファイルに似ています。[4]

PHPphp.iniは、 WindowsシステムとLinuxシステムの両方で「」構成ファイルにINI形式を使用します。[5] [6]

Desktop.iniファイルは、Windowsでのディレクトリの表示を決定します。たとえば、ディレクトリのアイコンです。[7]

次のサンプルファイルには2つのセクションがあります。1つはソフトウェアの所有者用で、もう1つは給与データベース接続用です。コメントには、ファイルを最後に変更した人と変更の理由が記録されます。

; 最終更新日2001年4月1日JohnDoe 
[所有者]
名前 =  JohnDoe
組織 =  AcmeWidgets Inc.

[データベース] 
; ネットワークの名前解決が機能しない場合はIPアドレスを使用する
server  =  192.0.2.62      
port  =  143 
file  =  "payroll.dat"

フォーマット

INIは非公式の形式であり、パーサーごとに機能が異なります(INI方言)。一部の機能は、他の機能よりも異なるパーサー間で共有され、フォーマットのハードコアと見なすことができます(たとえば、セクションの角かっこ、異なるノードを区切る改行など)。可能な限り多くの方言をサポートできるパーサーを作成する試みが存在し[8]、その最も高度な形式では、INI形式は他の構造化形式(JSON、XML)と同等のパワーでツリーオブジェクトを表現できます。よりリラックスした構文。

キー(プロパティ)

INIファイルに含まれる基本的な要素は、キーまたはプロパティです。すべてのキーには、等号(=)で区切られた名前と値があります。名前は等号の左側に表示されます。Windowsの実装では、等号とセミコロンは予約文字であり、キーに表示できません。値には任意の文字を含めることができます。

名前 = 

プロパティ名の外側の前後の空白は無視されます。

セクション

キーは、任意の名前のセクションにグループ化できますが、グループ化する必要はありませんセクション名は、角かっこ[および])で囲まれた行に単独で表示されます。セクション宣言の後のすべてのキーは、そのセクションに関連付けられています。明示的な「セクションの終わり」区切り文字はありません。セクションは、次のセクション宣言またはファイルの最後で終了します。セクションをネストすることはできません。

[セクション] 
key1  =  a 
key2  =  b

大文字と小文字の区別

Windowsの実装では、セクション名とプロパティ名で大文字と小文字が区別されませんが[9]、他のアプリケーションでは動作が異なる場合があります。

コメント

行頭のセミコロン; )はコメントを示します。コメント行は無視されます。

; コメントテキスト

セクションとプロパティの順序

セクション内のプロパティの順序とファイル内のセクションの順序は関係ありません。

さまざまな機能

INIファイル形式は厳密に定義されていないため、多くのパーサーは、すでに説明した基本を超える機能をサポートしています。以下は、特定のプログラム に実装されている場合とされていない場合がある、いくつかの一般的な機能のリストです。

グローバルプロパティ

オプションの「グローバル」プロパティも許可される場合があります。これは、セクションが宣言される前に宣言されます。[10]

名前/値の区切り文字

:一部の実装では、名前/値の区切り文字として(等号の代わりに)コロン()を使用できます。Linuxの世界では、空白が使用されることがあります。[8]

階層(セクションのネスト)

一部のパーサーでは、パス区切り文字としてドットを使用して、セクションのネストが可能です。

[セクション]
ドメイン =  wikipedia.org

[section.subsection] 
foo  =  bar

場合によっては、相対的な入れ子もサポートされます。先頭のドットは、前のセクションへの入れ子を表します。[8]

[セクション]
ドメイン =  wikipedia.org

[.subsection] 
foo  =  bar

歴史的に、ドットの代わりにネストを表現する方法も存在していました(たとえば、バックスラッシュが;の形式でネスト区切り文字として使用されdevlist.iniたMicrosoft Windows用のIBMのドライバーファイル、または完全に異なる構文を使用したMicrosoftVisualStudioのファイルおよびの形式で)。一部のパーサーは、ネストのサポートをまったく提供せず、階層ブラインドでしたが、一意の識別子を構成するという事実を利用することで、ネストを部分的にエミュレートすることができました。 [A\B\C]AEMANAGR.INI[A]B,C,P = V[A.B.C]

コメント

一部のソフトウェアは、コメントを示すためのセミコロンの代わりに番号記号(#)を使用することをサポートしています。特に、Unixでは、シェルコメントをミラーリングしています。番号記号は、他の方言のキー名に含まれている可能性があり、そのように無視されます。たとえば、次の行は、ある方言ではコメントとして解釈されますが、別の方言では「#var」という名前の変数を作成します。「#var」値を無視すると、コメントの疑似実装が形成されます。

#var = a

一部の実装では、コメントは、プロパティまたはセクション宣言の後の同じ行を含め、スペースの後の行のどこからでも開始できます(インラインコメント)。

var  =  a; これはインラインコメントです
foo  =  bar#これは別のインラインコメントです

WinAPI関数GetPrivateProfileStringを含むその他の場合、コメントはそれ自体で行に発生する必要があります。

重複する名前

ほとんどの実装は、セクションに指定された名前を持つ1つのプロパティのみをサポートします。プロパティ名の2番目の出現は中止を引き起こす可能性があり、無視される(および値が破棄される)か、最初の出現をオーバーライドする(最初の値が破棄される)可能性があります。一部のプログラムは、重複するプロパティ名を使用して複数値のプロパティを実装します。

同じ名前の複数のセクション宣言の解釈も異なります。一部の実装では、重複するセクションは、連続して発生したかのように、プロパティをマージするだけです。他の人は、INIファイルのいくつかの側面を中止または無視する可能性があります。

引用値

一部の実装では、通常は二重引用符アポストロフィを使用して、値を引用符で囲むことができますこれにより、空白の明示的な宣言、および/または特殊文字(等号、セミコロンなど)の引用が可能になります。標準のWindows関数GetPrivateProfileStringはこれをサポートし、値を囲む引用符を削除します。

エスケープ文字

一部の実装では、エスケープ文字のさまざまなサポートが提供されます。通常は、 C構文の後に円記号\)が続きます一部のサポートでは、バックスラッシュの直後にEOL(行末)が続くと改行が無視され、「論理行」はINIファイルの次の実際の行に継続されます。エスケープシーケンスを使用したさまざまな「特殊文字」の実装も見られます。[11]

一般的なエスケープシーケンス
順序 意味
\\ \(単一の円記号、エスケープ文字をエスケープ)
\' アポストロフィ
\" 二重引用符
\0 ヌル文字
\a ベル/アラート/可聴
\b バックスペース一部のアプリケーションの ベル文字
\t タブ文字
\r キャリッジリターン
\n 改行
\; セミコロン
\# 番号記号
\= 等号
\: 結腸
\x???? ????に対応する16進 コードポイントを持つUnicode文字

INIファイルへのアクセス

Windowsでは、プロファイルAPIは、従来のWindows.iniファイルから設定を読み書きするために使用されるプログラミングインターフェイスです。たとえば、GetPrivateProfileString関数は、初期化ファイルの指定されたセクションから文字列を取得します。(「プライベート」プロファイルは、 WIN.INIGetProfileStringからフェッチするとは対照的です。)

次のサンプル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 "データベース" "ポート" 143 "。\\ dbsettings.ini" );     
  // NB WritePrivateProfileInt()は存在しません
return 0 ;   
}

GetPrivateProfileString関数の3番目のパラメーターはデフォルト値であり、上記の2つの関数呼び出しではそれぞれ「127.0.0.1」と143です。このパラメーターに指定された引数がNULLの場合、デフォルトは空の文字列""です。

Unixでは、INIファイルにアクセスするためのさまざまな構成ライブラリが存在します。多くの場合、それらはすでにフレームワークとツールキットに含まれています。Unix用のINIパーサーの例には、GLibiniparserlibconfiniなどがあります。

INIパーサーの比較

名前 セクションサポート セクションネスティングのサポート エントリ認識の無効化[12] 複数行のサポート[13] 値のタイプ 読み取り/書き込みサポート プラットホーム ライセンス プログラミング言語 最新リリースバージョン
ConfigParser [14] [15] はい はい 番号 非標準[16] ブール値数値文字列 読み取り+書き込み * BSDLinuxmacOSWindows PSFL C(実装)、Python(使用法) 3.9.7 [17]
GLib [18] はい はい 番号 番号 ブール値数値文字列配列 読み取り+書き込み * BSDLinuxmacOSWindows LGPL C 2.66.7(2021年2月11日; 13か月前[±] [19] (2021-02-11

[20]

inifile [21] はい 番号 番号 番号 ブール値数値文字列 読み取り+書き込み * BSDLinuxmacOSWindows Apache 行け 1.2.0 [22]
inih [23] はい 番号 番号 非標準[24] ブール値数値文字列 読んだ * BSDLinuxmacOSWindows BSD C 53 [25]
iniparser [26] はい 番号 番号 はい ブール値数値文字列 読み取り+書き込み * BSDLinuxmacOSWindows MIT C 4.1 [27]
Java(経由java.util.Properties[28] 番号 番号 番号 はい ストリング 読み取り+書き込み プラットフォームに依存しない デュアルライセンス:クラスパス例外を含むGPLバージョン2 [29]およびプロプライエタリライセンス。[30] C(実装)、Java(使用法) 18(2022年3月22日; 4日前[±] (2022-03-22

17.0.2 LTS(2022年1月18日; 2か月前[±] 11.0.14 LTS(2022年1月18日; 2か月前[31][±] 8u321 LTS(2022年1月18日;2か月前[32 ][±] (2022-01-18
 (2022-01-18
 (2022-01-18

libconfini [33] はい はい はい はい ブール値数値文字列配列 読んだ * BSDLinuxmacOSWindows GPL C 1.16.2 [34]
PyINI [35] はい 番号 はい はい ブール値数値文字列 読み取り+書き込み プラットフォームに依存しない GPL Python 1.0 [36]
RudeConfig [37] はい 番号 番号 番号 ブール値数値文字列 読み取り+書き込み LinuxWindows GPL C ++ 廃止–最終バージョンは2009年11月から5.0.5です[38]
Windows API はい 番号 番号 番号 数値文字列構造体 読み取り+書き込み(非破壊) ウィンドウズ 専有 C 21H2(10.0.22000.556)(2022年3月8日; 18日前[39][±] (2022-03-08
WineWindows APIの実装) はい 番号 番号 番号 数値文字列構造体 読み取り+書き込み(非破壊) LinuxmacOSWindows LGPL C 7.0 [40] ウィキデータでこれを編集する 2022年1月18日; 2ヶ月前 (2022年1月18日
名前 セクションサポート セクションネスティングのサポート エントリ認識を無効にしました 複数行のサポート 値のタイプ 読み取り/書き込みサポート プラットホーム ライセンス プログラミング言語 最新リリースバージョン

ファイルマッピング

初期化ファイルマッピングは、INIファイルとレジストリ間のマッピングを作成します[41] [42]これは、従来の.iniファイルへの設定の保存から新しいWindowsレジストリに移行する方法として、WindowsNTおよびWindows95で導入されましたファイルマッピングは、プロファイルAPI呼び出しをトラップし、IniFileMappingレジストリセクションの設定を使用して、レジストリ内の適切な場所に読み取りと書き込みを送信します。

以下の例を使用すると、文字列呼び出しを行って、 dbsettings.iniなどの設定ファイルから所有者セクションから名前キーをフェッチできます戻り値は、文字列「JohnDoe」である必要があります。

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

INIマッピングはこのプロファイルAPI呼び出しを受け取り、指定されたファイル名のパスを無視し、ディレクトリの下のファイル名に一致するレジストリキーがあるかどうかを確認します。

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

これが存在する場合は、要求されたセクションに一致するエントリ名を探します。エントリが見つかった場合、INIマッピングはその値をレジストリの別の部分へのポインタとして使用します。次に、レジストリのその部分で要求されたINI設定を検索します。

一致するエントリ名が見つからず、(Default)エントリ名の下にエントリがある場合、INIマッピングは代わりにそれを使用します。したがって、各セクション名に独自のエントリは必要ありません。

HKEY_LOCAL_MACHINE \ Software \ ... \ IniFileMapping \ dbsettings.ini
(Default) @USR:Software \ oldprogs \ inisettings \ all
database USR:Software \ oldprogs \ inisettings \ db

したがって、この場合、[owner]セクションのプロファイル呼び出しは次のようにマップされます。

HKEY_CURRENT_USER \ Software \ oldprogs \ inisettings \ all
name ジョン・ドウ
organization Acme製品

ここで、 " name"レジストリエントリ名は、要求されたINIキーと一致することがわかります。次に、「JohnDoe」の値がプロファイル呼び出しに返されます。この場合、デフォルトの@プレフィックスは、読み取りがディスク上のdbsettings.iniファイルに送信されないようにします。その結果、レジストリにない設定はINIファイルで検索されません。

" database"レジストリエントリの値には@プレフィックスがありません。したがって、[データベース]セクションの場合のみ、レジストリの設定が最初に取得され、次にディスク上のdbsettings.iniファイルの設定が取得されます。

代替案

Windows 95以降、MicrosoftはINIファイルよりもWindowsレジストリの使用を強力に推進し始めました[43] INIファイルは通常2つのレベル(セクションとプロパティ)に制限されており、バイナリデータを適切に処理しません。ただし、レジストリはモノリシック、不透明、バイナリであり、ファイルシステムと同期している必要があり、オペレーティングシステムの単一障害点を表すため、この決定は批判の影響を受けません。[44]

その後、 XMLベースの構成ファイルがテキストファイルの構成をエンコードするための一般的な選択肢になりました。[要出典] XMLは、任意に複雑なレベルとネストを可能にし、バイナリデータをエンコードするための標準的なメカニズムを備えています。

最近では、JSONTOMLYAMLなどのデータシリアル化形式を構成形式として使用できます。これらの3つの代替形式は任意にネストできますが、INIファイルとは構文が異なります。その中で、TOMLはINIに最もよく似ていますが、TOMLをINIの大規模なサブセットと意図的に互換性を持たせるというアイデアは拒否されました。[45]

ただし、最新のINIパーサーは、XMLJSONTOML、およびYAMLの同じ任意のレベルのネストを許可し、型付き値Unicodeの同等のサポートを提供しますが、同じものを表現するための複数の構文を許可することにより、INIファイルの「非公式ステータス」を維持します。 。[46]

も参照してください

参照

  1. ^ Microsoft TechNet:Iniファイルアイテムを構成する
  2. ^ .conf初期化ファイル
  3. ^ Microsoft:WindowsNTワークステーションリソースキット
  4. ^ git-config構成ファイル[1]
  5. ^ ラスマス・ラードルフ、ケビン・タトロー、ピーター・マッキンタイア。 「プログラミングPHP」セクション「parse_ini_file」、「ExtensionINIEntries」など。
  6. ^ クリスチャンウェンズ。 「PHPとMySQLの会話集」「INIファイルの解析」セクション。引用:「... INIファイル形式...はWindowsの世界で非常に広く使用されていましたが、今日ではPHPなどのソフトウェア製品の構成も推進しています。たとえば...php.ini
  7. ^ Codrut Neagu、「デスクトップに2つのDesktop.iniファイルがあるのはなぜですか?それらは何をしますか?」
  8. ^ a bclibconfiniの ライブラリ 関数マニュアル
  9. ^ 「GetPrivateProfileString関数」MicrosoftDeveloperNetworkMicrosoft 2012年6月2日取得
  10. ^ org.apache.commons.configuration2.INIConfigurationのApacheドキュメント、Apache Software Foundation
  11. ^ Cloantoの実装
  12. ^ INIファイルの作成者の間では、不要なエントリを完全に削除するのではなく、無効にするために「コメントアウト」するのが一般的な方法です。a次の例のキーを参照してください
    [セクション] 
    #a
    = a b = b
  13. ^ 行継続の標準構文は、ここでは、 iniparser libconfini、およびによって実装される、バックスラッシュとそれに続く改行のシーケンスを指します。java.util.Properties
  14. ^ FredrikLundh。 「Python標準ライブラリ」2001.セクション「ConfigParserモジュール」。p。143
  15. ^ 「ConfigParser-構成ファイルパーサー」
  16. ^ ( Python )で動作するように設計された言語の構文に従って、ノードを複数の行にまたがるには、ConfigParserでは、より一般的なバックスラッシュ+改行ではなく、後続の行に深いインデントが必要です( configparser —構成を参照)。ファイルパーサー
  17. ^ バージョン別のPythonドキュメント
  18. ^ GLibキー値ファイルパーサー
  19. ^ ウィズナル、フィリップ(2021年2月11日)。「glib2.66.7」GNOME ftp-release(メーリングリスト)2021年2月12日取得
  20. ^ リリース・GNOME / glib
  21. ^ inifileドキュメント
  22. ^ リリース・inifile
  23. ^ inih README
  24. ^ インデントを使用し、ConfigParserのアプローチに明示的に従います(詳細については、プロジェクトのドキュメントを参照してください)
  25. ^ リリース・benhoyt / inih
  26. ^ iniparserのドキュメント
  27. ^ リリース・ndevilla / iniparser
  28. ^ プロパティ(Java Platform SE 8)
  29. ^ 「OpenJDK:GPLv2+クラスパス例外」Openjdk.java.net。1989-04-01 2016年2月9日取得
  30. ^ 「JavaSEのBCL」Oracle.com。2013-04-02 2016年2月9日取得
  31. ^ 「JDKリリース」OracleCorporation2022-01-21を取得
  32. ^ 「JDKリリース」OracleCorporation2022-01-21を取得
  33. ^ libconfiniドキュメント
  34. ^ リリース・madmurphy / libconfini
  35. ^ PyINI
  36. ^ タグ・whoatemybutter / PyINI
  37. ^ RudeConfigのドキュメント
  38. ^ リリース・RudeConfig
  39. ^ 「2022年3月8日-KB5011493(OSビルド2200.556)」MicrosoftサポートMicrosoft2022年3月8日。
  40. ^ 「Wine7.0がリリースされました」2022年1月18日2022年1月18日取得
  41. ^ 初期化ファイルとレジストリ Windows NTワークステーションリソースキット Microsoft TechNet
  42. ^ NTレジストリ管理、Windows NTレジストリの管理、Paul Robichaux、O'Reilly Media
  43. ^ システムレジストリ
  44. ^ Windowsレジストリは良いアイデアでしたか?–コーディングホラー
  45. ^ 「GitHubの「.INI互換性は価値のある目標」の問題に関するコメント」
  46. ^ libconfini / README

外部リンク