24

我是 Inno Setup 的新手。卡在一个问题上〜如何配置卸载部分以删除由应用程序创建的所有文件、文件夹、子文件夹,甚至新文件/文件夹等(换句话说,100% 删除应用程序和相关文件)。

我在这里和他们的论坛上搜寻,结果空无一物。任何人都可以向我指出有关如何执行此操作的文档、常见问题解答等吗?

更新

感谢到目前为止的所有反馈(非常棒)。所以看起来我可以使用卸载部分中的 {app}*.* 指令删除所有内容。看起来每个人都反对它。所以现在的问题变成了(我想知道这是否应该是一个全新的问题)在卸载过程中是否有一种方法可以询问用户“您要删除与此应用程序关联的所有项目文件吗?” 如果他们回答是,运行卸载 {app}*.* 块?

谢谢 -

4

9 回答 9

17

我认为推荐的方法是在卸载部分指定要删除的内容。原因是,如果用户出于某种原因决定将他们自己的文件放在他们不想删除的安装目录中,或者保存他们可能想要保留的数据(也许他们卸载是为了安装更新的版本? )

话虽如此,我不知道脚本是什么,但如果您使用 ISTool(强烈推荐),只需进入卸载删除部分并添加您想要删除的内容。它应该在一个漂亮的 GUI 中显示所有可能的选项并为您生成脚本。

编辑:来自 Inno Setup 文档的示例:

[UninstallDelete]
Type: files; Name: "{win}\MYPROG.INI"

但他们强烈你不会做类似的事情

[UninstallDelete]
Type: files; Name: "{app}\*.*"

注意:不要试图在这里使用通配符来删除 {app} 目录中的所有文件。我强烈建议不要这样做,原因有两个。首先,用户通常不喜欢在没有警告的情况下删除他们放在应用程序目录中的数据文件(例如,他们可能只是卸载它,因为他们想将其移动到不同的驱动器)。如果需要,最好让最终用户手动删除它们。另外,如果用户不小心将程序安装在错误的目录(例如C:\WINDOWS),然后又去卸载它,可能会造成灾难性的后果。再说一次,不要这样做!

于 2009-03-13T16:45:28.267 回答
12

您可能应该将此作为一个全新的问题,但我也会在这里回答您更新的问题。查看Inno 安装文档中的“Pascal 脚本:卸载代码”部分。

举例说明如何在卸载过程中有条件地删除数据文件:

[Code]

procedure DeleteBitmaps(ADirName: string);
var
  FindRec: TFindRec;
begin
  if FindFirst(ADirName + '\*.*', FindRec) then begin
    try
      repeat
        if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then begin
          if (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin
            DeleteBitmaps(ADirName + '\' + FindRec.Name);
            RemoveDir(ADirName + '\' + FindRec.Name);
          end;
        end else if Pos('.bmp', AnsiLowerCase(FindRec.Name)) > 0 then
          DeleteFile(ADirName + '\' + FindRec.Name);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then begin
    if MsgBox('Do you want to delete all data files?', mbConfirmation,
        MB_YESNO) = IDYES 
    then begin
      DeleteBitmaps(ExpandConstant('{app}'));
    end;
  end;
end;

但是根据您需要清理的东西的数量,您最好创建一个特殊的帮助程序,它是安装的一部分,并且可以在卸载应用程序期间执行(使用[UninstallRun]中的条目)部分)。

于 2009-03-16T09:55:55.460 回答
6

有时需要删除在安装时最初未写入用户磁盘的文件。其中一种情况是您的应用程序在启动时会自行更新。可以以这种方式将不属于卸载程序的新文件添加到磁盘中。

对于这种情况,我建议您创建一个“补丁清单”文件,该文件会记录 {app} 目录中应包含哪些文件。在下面找到从 {app} 目录中名为“patch_manifest.txt”的文件中读取的代码示例

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  i: Integer;
  arrayLen: Longint;
  item: String;
  itemsToDelete: Array of String;
begin
  case CurUninstallStep of
    usUninstall:
      begin
        LoadStringsFromFile(ExpandConstant('{app}') + '\patch_manifest.txt', itemsToDelete);
        arrayLen := GetArrayLength(itemsToDelete);
        for i := 0 to arrayLen-1 do
          begin
          item := ExpandConstant('{app}') + '\' + itemsToDelete[i];
          if FileExists(item) then
            DeleteFile(item);
          if DirExists(item) then
            RemoveDir(item);
          end;
      end;
  end;
end;

和 patch_manifest.txt 的样本

data/something_here.dat
data/moredatahere.dat
data/
Launcher.exe
patch_manifest.txt

注意:patch_manifest 中的行顺序很重要。目录中的所有文件应首先列出,然后是目录 - 非空目录不能删除。

您的应用程序应该附带一个 patch_manifest,并且 patch_manifest 应该随每个补丁更新。将此作为构建过程的一部分,这样您就不会忘记更新它!

即使提示用户,也不要使用通配符 ( . ) 删除,这一点非常重要。卸载程序具有提升的权限,这可能会破坏用户的计算机。以用户不小心将您的应用程序安装到 C:\Windows\ 或 C:\Program Files 为例。

另一个好主意是通过在删除之前执行 MD5 检查来验证该文件实际上是“您的文件”。在这种情况下,您的 patch_manifest.txt 不仅包括文件的相对路径,还包括 MD5 校验和。

于 2011-03-19T04:04:44.970 回答
4

您不能使用 InnoSetup 卸载它没有安装的任何东西,而且您不应该这样做。如果我安装了一个应用程序,输入了大量数据,然后决定使用其他东西来代替从你的应用程序中读取这些数据,我会非常不高兴。如果您的卸载杀死了我已经完成的所有工作,我可能会很想来找您。而且可能不会给你买杯咖啡。

或者考虑一下我在评估几个过程中安装您的应用程序的情况。我尝试了这些应用程序,并继续使用您的应用程序,因为我更喜欢它,并且每次输入更多数据。然后我决定暂时不做任何事情,所以我删除了所有测试应用程序。一周后,我决定我现在需要使用你的应用程序,然后重新安装它。哎呀!我所做的所有我现在想使用的测试工作都消失了。

以上就是为什么,当您卸载应用程序时,它会留下您在文件夹中创建的任何内容,例如配置文件、数据文件等。它不知道您希望它对它们做什么,所以它不理会它们。

于 2009-03-13T16:51:24.133 回答
4

这应该可以解决问题:

[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
于 2013-09-18T05:00:41.527 回答
4

在 Inno Setup Studio 中添加删除文件/文件夹项。或者直接使用脚本如下。

[生成的代码示例]

[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"
于 2018-11-14T10:05:54.680 回答
2

我想删除gData.dat在安装文件夹中运行时创建的

对我来说工作得很好

[UninstallDelete]
Type: files; Name: "{app}\gData.dat"
于 2015-02-17T04:38:18.060 回答
1

如果您没有为条目指定“uninsneveruninstall”,那不是默认设置吗?

编辑 - 对不起,我没有意识到你在谈论新创建的数据文件。

于 2009-03-13T16:36:48.227 回答
-1

要删除我使用的所有内容:

[UninstallDelete]
Type:files; Name: "{app}"
于 2015-03-12T11:34:23.830 回答