Перезаписывать существующий файл данных только при установке более новой версии приложения с помощью Inno Setup - PullRequest
0 голосов
/ 23 января 2019

Я использую Inno Setup для создания установщика. Когда я запускаю установщик более старой версии (например, 1.0.0.2) на компьютере, на котором уже установлено приложение более новой версии (например, 1.0.0.3), я не хочу, чтобы файлы с таким именем перезаписывались.

Как я понял отсюда

  1. Если существующий файл имеет более новую версию, чем устанавливаемый файл, или если у существующего файла есть информация о версии, а у устанавливаемого файла нет, существующий файл не будет заменен.
    Справка Inno Setup, раздел Files

запуск установщика более старой версии поверх существующей более новой версии НЕ должен заменять существующий файл.

Я создал два установщика. Старая версия (1) имеет:

AppVersion=1.0.0.2
VersionInfoVersion={#SetupSetting('AppVersion')}

и более новая версия (2) имеет:

AppVersion=1.0.0.3
VersionInfoVersion={#SetupSetting('AppVersion')}

Оба установщика имеют одинаковый раздел Файлы:

[Files]
Source: "D:\installer\test1003\*"; DestDir: "{app}\app"; Flags: recursesubdirs createallsubdirs

Но когда я запускаю (1) с (2) установленным файлом с тем же именем, он заменяется (и наоборот, но, как я понимаю, это логично)

Я решил создать файлы журналов для обоих установщиков, и вот что я получил:

Имя файла Dest: C: \ Program Files \ dir \ app \ tryout.txt
Отметка времени нашего файла: 2019-01-23 13: 02: 10.000 Файл Dest существует.
Отметка времени существующего файла: 2019-01-23 13: 01: 50.000
Версия нашего файла: (нет)
Версия существующего файла: (нет)

Эти части идентичны, кроме меток времени.

Есть идеи, как установить версии для установленных файлов?

Спасибо заранее.

Я не уверен, что это важно, но я использую версию Inno Setup для Unicode. Теперь он поддерживает только одну версию, но я хочу добавить еще позже.

1 Ответ

0 голосов
/ 23 января 2019

Если вы хотите установить определенный файл, если вы устанавливаете только более новую версию программы установки, вы можете использовать следующий код:

[Setup]
AppName=My Program
AppVersion=1.5

[Files]
; Overwrite .exe always
Source: "MyProg.exe"; DestDir: "{app}"
; Overwrite .dat file only when installing a newer version
Source: "MyProg.dat"; DestDir: "{app}"; Check: IsInstallingNewerVersion
[Code]

{ Update AppId in the key! }
const
  UninstallKey = 'Software\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1';
  DisplayVersionValue = 'DisplayVersion';

var
  InstallingNewerVersion: Boolean;

function IsInstallingNewerVersion: Boolean;
begin
  Result := InstallingNewerVersion;
end;

function InitializeSetup(): Boolean;
var
  PrevVersion, CurVersion: string;
begin
  if RegQueryStringValue(HKLM, UninstallKey, DisplayVersionValue, PrevVersion) or
     RegQueryStringValue(HKCU, UninstallKey, DisplayVersionValue, PrevVersion) then
  begin
    Log(Format('Previous version %s', [PrevVersion]));
    CurVersion := '{#SetupSetting('AppVersion')}';
    Log(Format('Installing version %s', [CurVersion]));
    InstallingNewerVersion := (CompareVersion(PrevVersion, CurVersion) < 0);
    if InstallingNewerVersion then Log('Installing newer version')
      else Log('Not installing newer version')
  end;

  Result := True;
end;

Получить функцию CompareVersion из Сравнить строки версий в Inno Setup .

...