イニシャルファイル(環境設定ファイル)の置き場所


 プログラムの環境設定ファイル(イニシャルファイル)について、マイクロソフトは、レジストリーへ登録することを推奨していますが、レジストリーファイルが大きくなると、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形式のイニシャルファイルを使用した例をダウンロード出来るようにしてあります。

download HTMLiniFile.zip