Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inno setup 如何配置Inno安装程序以卸载所有内容?_Inno Setup - Fatal编程技术网

Inno setup 如何配置Inno安装程序以卸载所有内容?

Inno setup 如何配置Inno安装程序以卸载所有内容?,inno-setup,Inno Setup,我是Inno安装的新手。陷入一个问题~如何配置卸载部件以删除应用程序创建的所有文件、文件夹、子文件夹,甚至新文件/文件夹等(换句话说,100%删除应用程序和相关文件) 我在这里四处搜寻,也在他们的论坛上搜寻,结果一无所获。有人能给我指一份关于如何做到这一点的文档、常见问题解答等吗 更新 感谢到目前为止的所有反馈(非常棒)。看起来我可以使用卸载部分中的{app}**指令删除所有内容。看起来每个人都在反对它因此问题现在变成了(我想知道这是否应该是一个全新的问题)在卸载过程中,我们是否可以询问用户“是

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

我在这里四处搜寻,也在他们的论坛上搜寻,结果一无所获。有人能给我指一份关于如何做到这一点的文档、常见问题解答等吗

更新

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


谢谢-

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


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

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

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

编辑:Inno安装文档中的示例:

[UninstallDelete]
Type: files; Name: "{win}\MYPROG.INI"
但他们强烈要求你不要这样做

[UninstallDelete]
Type: files; Name: "{app}\*.*"
注意:不要试图在此处使用通配符删除中的所有文件 {app}目录。我强烈地 建议两个人不要这样做 原因。首先,用户通常不会 感谢拥有他们的数据文件 他们把它放在应用程序目录中 在没有警告的情况下删除(它们可能会 只能卸载它,因为它们 要将其移动到其他驱动器, 例如)。最好还是离开它 由最终用户手动删除 如果他们愿意的话。此外,如果用户 碰巧在中安装了该程序 错误的目录(用于 例如,C:\WINDOWS),然后转到 卸载它可能会有灾难性的后果 后果。再说一次,不要这样做


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

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


这就是为什么当你卸载一个应用程序时,它会留下你在文件夹中创建的任何东西,如配置文件、数据文件等。它不知道你希望它对它们做什么,所以它会留下它们。

你可能应该把这变成一个全新的问题,但我也会在这里回答你更新的问题。请查看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;
[代码]
过程删除位图(ADirName:string);
变量
FindRec:TFindRec;
开始
如果FindFirst(ADirName+'\*.*',FindRec),则开始
尝试
重复
如果FindRec.Attributes和文件属性目录0,则开始
如果(FindRec.Name'.'和(FindRec.Name'.'),则开始
删除位图(ADirName+'\'+FindRec.Name);
RemoveDir(ADirName+'\'+FindRec.Name);
结束;
如果Pos('.bmp',AnsiLowerCase(FindRec.Name))>0,则结束else
DeleteFile(ADirName+'\'+FindRec.Name);
直到没有FindNext(FindRec);
最后
FindClose(FindRec);
结束;
结束;
结束;
过程CurUninstallStep已更改(CurUninstallStep:TUninstallStep);
开始
如果CurUninstallStep=usUninstall,则开始
如果MsgBox('是否要删除所有数据文件?'),mbConfirmation,
MB_YESNO)=田园诗
然后开始
删除位图(ExpandConstant({app}');
结束;
结束;
结束;

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

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

对于这种情况,我建议您创建一个“补丁清单”文件,该文件保存{app}目录中应该包含哪些文件的运行记录。下面是从{app}dir中名为'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;
和一个补丁_manifest.txt的示例

data/something_here.dat
data/moredatahere.dat
data/
Launcher.exe
patch_manifest.txt
注意:修补程序清单中的行顺序很重要。目录中的所有文件应首先列出,然后再列出
[Dirs]
Name: "{app}"; Flags: uninsalwaysuninstall
[UninstallDelete]
Type: files; Name: "{app}\gData.dat"
[UninstallDelete]
Type:files; Name: "{app}"
[UninstallDelete]
Type: filesandordirs; Name: "{app}\unnecessary_files"