1

我已经使用 Inno Setup 发布了一个应用程序。遗憾的是,该应用程序已将数据库文件安装为源文件,因此如果卸载该应用程序,则会删除整个数据库文件。

我将很快发布一个新版本。我希望新版本覆盖以前的版本,根本不安装数据库文件,而是由应用程序本身创建数据库。

如果我安装新版本而不安装原始版本,一切正常。应用程序创建一个数据库文件,卸载后,数据库保留在机器上。

问题是,如果我在机器上安装了以前的版本,然后安装了新版本,那么在卸载新版本后,数据库文件总是被删除。

两个应用程序都使用相同的 AppId 进入同一目录。

如何撤销之前安装程序安排的文件删除?

4

5 回答 5

3

如果添加uninsneveruninstall标志,您可以继续安装数据库文件。这将在卸载应用程序时留下文件和目录。不幸的是,现在添加此标志无济于事,因为卸载仍将删除数据库文件 - 初始安装中的数据库文件的文件条目不会被以后的安装修改,因此数据库文件将始终被删除。似乎没有办法解决这个问题。

您可以做的是将代码添加到新的安装程序(或卸载程序)中,以制作数据库文件的备份副本。然后将保留文件和目录,因为卸载程序默认情况下不会删除安装程序未创建的任何内容。

于 2010-01-14T19:32:52.603 回答
1

在新版本中,我建议您使用不同的名称创建数据库文件。这将是一种确保它永远不会被任何以前的安装程序卸载的简单方法。

新版本的安装程序(使用一些 Pascal 脚本),或者应用程序本身,可以检测到具有旧名称的数据库(如果存在),并且:

  • 将数据从旧文件复制到新文件
    • 也许将旧的重命名为具有不同名称的备份
  • 或者只是将文件重命名为新名称

您必须仔细考虑所有可能的安装、卸载、重新安装方案,并且不要弄乱每个方案中的数据。

于 2010-01-16T10:05:49.193 回答
1

谢谢你的回复。我同意这里最明显的解决方案是将数据库文件复制到新位置并忘记问题。所以我的赞成票投给了mghie。

我设法通过删除 unins000.* 文件来实现我所需要的:

[InstallDelete]
Type: files; Name: "{app}\unins000.dat"
Type: files; Name: "{app}\unins000.exe"

我需要删除这两个文件。此外,我必须重新安装所有带有“ignoreversion”标志的文件,以便新的卸载程序将它们删除:

[Files]
Source: {#SourceFileDir}\my.exe; DestDir: {app}; Flags: ignoreversion

这当然有一些缺点,不是 100% 安全的,但在我的情况下有效。

于 2010-01-24T12:03:31.357 回答
0

尝试在脚本中更改您的 AppID。

从 InnoSetup 帮助文件:

AppId 的值存储在卸载日志文件 (unins???.dat) 中,并由后续安装检查以确定它是否可以附加到特定的现有卸载日志。如果现有卸载日志的 AppId 与当前安装的 AppId 相同,安装程序只会附加到卸载日志。

于 2010-01-14T09:51:10.727 回答
0

这是一个相当高级的话题(我认为)。

我建议在 innosetup 的新闻组中问这个问题:

news://news.jrsoftware.org/jrsoftware.innosetup

如果您在新闻组中收到答案,请在此处发布结果。

于 2010-01-16T09:14:08.807 回答