Delphi InnoSetup';s相当于;覆盖目标,如果它没有';自上次安装以来未更改;?

Delphi InnoSetup';s相当于;覆盖目标,如果它没有';自上次安装以来未更改;?,delphi,inno-setup,Delphi,Inno Setup,浏览完网页后,我能找到的最接近InnoSetup的“覆盖用户未更改的所有文件”的链接如下: 然而,这是不完整的,我不是帕斯卡专家。我不知道它是如何保存tStringList的(当我测试它的时候也没有) 我的应用程序将来自十几个源的大量XML文件安装到公共用户的documents文件夹中。(是的,我的源代码使用**子路径操作符。)用户可能会更改一些文件。应用程序可能会更改其中的一些。我不想撤消任何用户的工作,但在升级时,我确实希望替换用户未触及的任何XML文件。如何使用InnoSetup完成此操

浏览完网页后,我能找到的最接近InnoSetup的“覆盖用户未更改的所有文件”的链接如下:

然而,这是不完整的,我不是帕斯卡专家。我不知道它是如何保存tStringList的(当我测试它的时候也没有)


我的应用程序将来自十几个源的大量XML文件安装到公共用户的documents文件夹中。(是的,我的源代码使用**子路径操作符。)用户可能会更改一些文件。应用程序可能会更改其中的一些。我不想撤消任何用户的工作,但在升级时,我确实希望替换用户未触及的任何XML文件。如何使用InnoSetup完成此操作?(类似地,当我卸载时,我似乎应该删除用户/应用程序未更改的所有文件。)

可能没有什么好方法来区分用户编辑和应用程序编辑,除非您确切知道应用程序可能会做出什么样的更改,并且用户不会做出类似的更改,如果您愿意并且能够编写
[code]
,通过读取文件内容来检测差异

但是,您可以使其替换旧文件的特定版本,前提是您自己仍然拥有这些文件的副本。一个示例说明了如何做到这一点(这只是现场编写的,我还没有测试):

添加此参数后,您只需将
Check
调用中使用的参数替换为以逗号分隔的MD5值列表(例如使用
md5sum
)您希望用替换版本覆盖的应用程序以前版本分发的文件的所有可能版本

如果文件不存在,将安装该文件。如果它确实存在,并且其散列值与指定的散列值之一匹配,则它将被覆盖。否则它将被单独留下


请注意,尽管有不同的内容,但由于具有相同的MD5哈希,文件被错误覆盖的可能性很小,因为哈希可能会产生冲突。然而,这种偶然发生的可能性很小,你通常可以忽略它。(另一种选择是使用SHA-1散列而不是MD5散列;因为它更长,所以冲突的可能性更小。)

我不会那样做。在设计安装程序时,请始终记住更改应用程序以使安装更干净的选项。我刚刚看到了以下链接:是的,我们的新版本软件消除了这种愚蠢。不幸的是,我仍然有三年的时间支持当前版本。目前,我可以只考虑标志(但您必须依赖目标系统时钟,并且必须使用过去很深的日期时间)。但是,从
[code]
部分可以存储这些已安装文件及其散列的列表,并且在升级设置中,在覆盖这些文件之前,将此文件散列列表与新文件散列进行比较。
[Files]
Source: SomeFile.xml; ...; Check: IsOverwritable('123456FEDCBA,ABD48291')

[Code]
function IsOverwritable(HashText: String): Boolean;
var
  Filename, Hash: String;
  Hashes: TStringList;
begin
  Filename := ExpandConstant(CurrentFileName);
  if not FileExists(Filename) then begin
    Result := True;
  end else begin
    Hash := GetMD5OfFile(Filename);
    Hashes := TStringList.Create();
    Hashes.CommaText := HashText;
    Result := Hashes.IndexOf(Hash) >= 0;
    Hashes.Free();
  end;
end;