如何配置Inno Setup以卸载所有内容?

时间:2009-03-13 16:29:14

标签: inno-setup

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

我在这里和他们的论坛上搜寻,然后空了。任何人都可以给我一个文件,FAQ等关于如何做到这一点?

更新

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

谢谢 -

9 个答案:

答案 0 :(得分:15)

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

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

编辑:Inno Setup文档中的一个示例:

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

但他们强烈要求你不要做像

这样的事情
[UninstallDelete]
Type: files; Name: "{app}\*.*"
  

注意:不要试图在这里使用通配符删除所有文件   {app}目录。我强烈地说   建议不要两个人这样做   原因。首先,用户通常不这样做   欣赏他们的数据文件   他们放在应用程序目录中   删除没有警告(他们可能会   只是卸载它因为它们   想把它移到另一个驱动器,   例如)。最好离开它   最终用户手动删除   如果他们想要他们。另外,如果用户   碰巧安装程序在   错误的错误目录(for   例如,C:\ WINDOWS)然后去了   卸载它可能是灾难性的   后果。所以,请不要这样做!

答案 1 :(得分:11)

你应该把这个问题作为一个全新的问题,但我也会在这里回答你的更新问题。请查看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] 部分)。

答案 2 :(得分:5)

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

对于这种情况,我建议您创建一个“补丁清单”文件,该文件保存{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校验和。

答案 3 :(得分:4)

这应该可以解决问题:

[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall

答案 4 :(得分:3)

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

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

以上是为什么当你卸载一个应用程序时,它会留下你在文件夹中创建的任何内容,比如配置文件,数据文件等。它不知道你想用它做什么,所以它离开了他们一个人。

答案 5 :(得分:1)

我想删除在已安装文件夹

中运行时创建的gData.dat

并且对我来说工作正常

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

答案 6 :(得分:1)

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

[生成的代码示例]

[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"

答案 7 :(得分:0)

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

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

答案 8 :(得分:-1)

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

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