gpt4 book ai didi

delphi - InnoSetup 相当于 "overwrite destination if it hasn' t 自上次安装以来发生了变化”?

转载 作者:行者123 更新时间:2023-12-03 15:54:46 25 4
gpt4 key购买 nike

在网上搜索后,我能找到的最接近 InnoSetup 的“覆盖用户未更改的所有文件”的内容是这里的链接:

InnoSetup: don't uninstall changed files

但是,它并不完整,而且我也不是 Pascal 专家。我不明白它如何保存 tStringList(我测试时也没有)。

我的应用程序将来自十几个来源的大量 XML 文件安装到公共(public)用户的文档文件夹中。 (是的,我的源使用 ** 子路径运算符。)用户可能会更改某些文件。该应用程序可能会更改其中一些。我不想撤消任何用户工作,但当我升级时,我确实想替换用户未触及的任何 XML 文件。我怎样才能用 InnoSetup 做到这一点? (同样,当我卸载时,我似乎应该删除用户/应用程序未更改的所有文件。)

最佳答案

可能没有任何好的方法来区分用户编辑和应用程序编辑,除非您确切地知道应用程序可能会进行什么样的更改并且用户不会进行类似的更改,并且您愿意并且能够写入[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;

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

如果该文件不存在,则会安装该文件。如果它确实存在,并且其哈希值与指定的哈希值之一匹配,则它将被覆盖。否则它将被孤立。

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

关于delphi - InnoSetup 相当于 "overwrite destination if it hasn' t 自上次安装以来发生了变化”?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19670629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com