Как я могу создать INI-файл в {commonappdata}, который может быть записан любым способом при использовании Innosetup - PullRequest
2 голосов
/ 21 апреля 2011

Если я хочу создать файлы в папке {commonappdata}, мне нужно добавить параметр Permissions:users-modify в строку [Files] Source:....

Это прекрасно работает ( Я наконец-то понял, как убедиться, что при смене одного из установленных файлов из установленной программы ) не было никакой перемещаемой папки.

Однако, как я могу сделать INI-записи из раздела [INI] Filename:..., также доступными для записи любому пользователю на ПК ? В конце концов, это программные значения, а не пользовательские.

Как и сейчас, ini-файл записывается установкой Inno-setup, но если я позже запустил установленную программу и изменил ini-файл грамматически, записывается перемещаемая версия ini-файла.

Для заполнения:

  • Я знаю о способе создания ini-файла в качестве шаблона при установке приложения, а затем при первом запуске программы скопируйте их в папку {commonappdata}, но я просто интересно, можно ли это сделать из скрипта Inno-Setup.

  • Я использую последнюю версию Inno-Setup 5.4.2 под Windows 7 Prof 64 (если это должно изменить ситуацию).

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

Вы будете обвинены в этом дизайне. У вас могут быть противоречащие настройки пользователя, если вы храните их в папках с данными приложения. Обратитесь к этому вопросу для получения дополнительной вины. ;)

В любом случае, только разделы [Files], [Dirs] и [Registry] разрешают параметр «Permissions». Поэтому для секции [Ini] невозможно создать INI-файл с измененными разрешениями. Одним из способов решения вашей задачи может быть использование раздела «ini» для сбора необходимой информации во время установки, а затем в качестве действия после установки перенесите содержимое файла ini в файл с измененными разрешениями, созданными в разделе «файлы». Как то так:

[Files]
Source: MyProg.ini; DestDir: {commonappdata}\MyCompany; Permissions: users-modify; 
;// ini file contents will be transferred to this file

[Ini]
filename: {commonappdata}\MyCompany\MyProg_Temp.ini; section: users; key: username; string: {username}; Flags: UninsDeleteEntry; 
;// this is used in the installation, and will be deleted in post-install
...

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  s: string;
begin
  if CurStep = ssPostInstall then begin
    if LoadStringFromFile(ExpandConstant('{commonappdata}\MyCompany\MyProg_Temp.ini'), s) and
        SaveStringToFile(ExpandConstant('{commonappdata}\MyCompany\MyProg.ini'), s, False) then
      DeleteFile(ExpandConstant('{commonappdata}\MyCompany\MyProg_Temp.ini'));
  end;
end;
0 голосов
/ 08 августа 2014

Inno Setup позволяет устанавливать разрешения только в разделах [Files] [Dirs] и [Registry], и вам придется как-то их использовать. Вот 2 решения этой проблемы. Оба хороши, но у каждого есть небольшой недостаток.

Решение № 1: Установить разрешение для всего каталога

[Dirs]
Name: {commonappdata}\MyCompany; Permissions:everyone-modify

[INI]
Filename: {commonappdata}\MyCompany\MyProg.ini; Section: "SomeSection"; Key: "SomeKey"; String: "SomeValue"

Это отличное решение, если вы не возражаете против изменения разрешений всего каталога. Я возражал и придумал второе решение.

Решение № 2: Создайте свой файл .ini в {tmp} и скопируйте его в раздел [Files]:

#define TargetIniDir "{commonappdata}\MyCompany"
#define TargetIniName "MyProg.ini"
....

[Files]
Source: {tmp}\{#TargetIniName}; DestDir: {#TargetIniDir}; Flags:external; Permissions: users-modify;

....

[Code]
procedure PrepareIniFileForCopy(section, key, value, iniFileTemp, iniFileTarget:String);
begin
    if FileExists(iniFileTarget) then 
      FileCopy(iniFileTarget, iniFileTemp, False);

    SetIniString(section, key, value,  iniFileTemp);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  iniFile, iniFileTemp:String;
begin
  if CurStep=ssInstall then begin
    PrepareIniFileForCopy('SomeSection', 'SomeKey', 'SomeValue', ExpandConstant('{tmp}\{#TargetIniName}'), ExpandConstant('{#TargetIniDir}\{#TargetIniName}'));

  end;
end;

Это создаст ваш файл .ini в каталоге {tmp} (который будет удален после завершения установки), а затем скопирован в раздел [Files] в нужный каталог commondata с необходимыми разрешениями. Обратите внимание на флаг external в разделе [Files], который означает, что файл не упакован в настройку во время компиляции, а динамически выполняется во время установки. Также обратите внимание, что создание временного файла должно быть сделано до установки (CurStep = ssInstall означает непосредственно перед установкой).

Я думаю, это решение хорошо, но не очень красиво. Вы разделяете свою операцию на два разных места, которые полагаются на то, что одно выполняется раньше другого.

Оба решения могут добавлять значения к существующим файлам .ini, а не просто создавать новые.

...