代码之家  ›  专栏  ›  技术社区  ›  agsamek

如何通过Inno安装程序撤消上一次安装计划的文件删除

  •  1
  • agsamek  · 技术社区  · 15 年前

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

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

    如果我安装新版本而不安装原来的版本,一切都会正常工作。应用程序创建一个数据库文件,卸载后,数据库将保留在计算机上。

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

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

    如何撤消以前安装程序计划的文件删除?

    5 回复  |  直到 15 年前
        1
  •  3
  •   mghie    15 年前

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

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

        2
  •  1
  •   Craig McQueen Dr. Watson    15 年前

    在新版本中,我建议您使用其他名称创建DB文件。这将是一个简单的方法来确保它不会被任何以前的安装程序卸载。

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

    • 将数据从旧文件复制到新文件
      • 可能将旧的备份重命名为另一个名称
    • 或者只需将文件重命名为新名称

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

        3
  •  1
  •   agsamek    15 年前

    感谢您的回复。我同意这里最明显的解决方案是将数据库文件复制到一个新的位置,然后忽略这个问题。所以我的赞成票投给了米吉。

    我通过删除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%安全,但在我的情况下是有效的。

        4
  •  0
  •   mghie    15 年前

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

    从InnoSetup帮助文件:

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

        5
  •  0
  •   Edelcom    15 年前

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

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

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

    如果你在新闻组收到答案,请把结果贴在这里。