イニシャルファイル(環境設定ファイル)の置き場所
プログラムの環境設定ファイル(イニシャルファイル)について、マイクロソフトは、レジストリーへ登録することを推奨していますが、レジストリーファイルが大きくなると、Windowsのパーフォマンスに影響するので、レジストリーファイルをあまり汚したくありません。
今迄のIni拡張子のイニシャルファイル、Xml形式の環境設定ファイルを使用するのですが、セキュリティの関係上、ファイルを置く場所が限られます。
実行ファイルと同じ場所に起きたい場合は、実行ファイルを、Windows、Program
Files等のセキュリティで保護されたフォルダーへ置くことは出来ません。
その場合は、C:¥、D:¥等の下にフォルダーを作成し、そこへ実行ファイルと、イニシャルファイルを置く必要性があります。
しかし、その場合、実行ファイルはセキュリティ上保護されなくなります。
実行プログラムを保護するためには、Program
Filesの下にフォルダーを作成し、その中に実行ファイルを置きます、環境設定ファイルは、Users、AllUsersのユーザー用フォルダー内に置くのですが、置く場所は、Windowsの場合指定されています。
その場所は、C:\Users\Username\AppData\Roaming、 C:\Users\Username\AppData\Local 又は、 C:\Users\All users\AppData となりますが、パソコン、ユーザーによって、ホルダー名が変わるので、Windows APIの SHGetSpecialFolderPath を使用して、フォルダー名を取得する必要があります。
下記の例は、環境設定用フォルダーの場所を読み出し、自分用のフォルダーが未作成の場合フォルダーを作成する例です。
フォルダー名は、プログラムの製作者の名前、会社の名前等にして解りやすくします。
インストーラーを使用する場合、インストーラーで、イニシャルファイルのおき場所を指定すれば、指定した名前で 新しくフォルダーを作成し その中にファイルをインストールしてくれます。
しかし、フォルダーは、誤って削除される可能性もあるので、プログラム上で、フォルダーが無い場合作成するようにします。
var IniFolder: string; const INIFOLDERNAME = 'XMLiniTEST'; function GetPath(Second: integer): string; var PATH: Array[0..MAX_PATH - 1] of char; begin if SHGetSpecialFolderPath(Application.Handle, PATH, Second, False) then Result := PATH else Result := ''; end; procedure Form1.Button1Click(Sender: TObject); begin // IniFolder := GetPath(CSIDL_LOCAL_APPDATA); // ユーザーローカルデーターフォルダーの取得 IniFolder := GetPath(CSIDL_APPDATA); // ユーザーデーターフォルダーの取得 if IniFolder = '' then begin MessageDlg('フォルダーの取得に失敗しました。', mtInformation, [mbOk], 0); exit; // 取得できなかったら終了 end; IniFolder := IniFolder + '\' + INIFOLDERNAME; // iniファイル用フォルダー名セット if not DirectoryExists(IniFolder) then begin // ini用フォルダーが無かったら作成する。 if not CreateDir(IniFolder) then // ini用フォルダーの作成 MessageDlg('フォルダーの作成に失敗しました。', mtInformation, [mbOk], 0); end; end;
XML形式のイニシャルファイルを使用した例をダウンロード出来るようにしてあります。