可能没有任何好的方法可以区分用户编辑和应用程序编辑,除非您确切地知道应用程序可能会做出什么样的更改并且用户不会做出类似的更改,并且如果您愿意并且能够编写[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 散列;因为它更长,冲突的可能性更小。)