仅当使用Inno Setup安装新版本的应用程序时,才覆盖现有数据文件

时间:2019-01-23 12:10:47

标签: installer inno-setup

我正在使用Inno Setup创建安装程序。当我在已经安装了较新版本(例如1.0.0.3)应用程序的计算机上运行较旧版本(例如1.0.0.2)的安装程序时,我不希望覆盖具有相同名称的文件。

据我所知

  
      
  1. 如果现有文件的版本比要安装的文件新,或者现有文件具有版本信息,但是要安装的文件没有,则不会替换现有文件。
      Inno Setup help, Files section
  2.   

在现有的较新版本上运行较旧版本的安装程序一定不能替换现有文件。

我已经创建了两个安装程序。较旧的版本(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)已安装文件的同名文件时(反之亦然,但据我所知这是合乎逻辑的)

我决定为两个安装程序都创建日志文件,这就是我得到的:

  

目标文件名:C:\ Program Files \ dir \ app \ tryout.txt
  我们的文件时间戳记:2019-01-23 13:02:10.000   目标文件存在。
  现有文件的时间戳记:2019-01-23 13:01:50.000
  文件的版本:(无)
  现有文件的版本:(无)

这些部分除了时间戳相同。

关于如何为已安装文件设置版本的任何想法?

先谢谢了。

我不确定这是否重要,但是我正在使用Unicode版本的Inno Setup。现在它仅支持一个版本,但我想稍后再添加。

1 个答案:

答案 0 :(得分:0)

如果要安装某个文件,如果仅安装更新版本的安装程序,则可以使用以下代码:

[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;

Compare version strings in Inno Setup获取CompareVersion函数。