我是Inno Setup的新手。困在一个问题〜如何配置卸载件以删除应用程序创建的所有文件,文件夹,子文件夹,甚至新文件/文件夹等(换句话说,100%删除应用程序和相关文件)。
我在这里和他们的论坛上搜寻,然后空了。任何人都可以给我一个文件,FAQ等关于如何做到这一点?
更新
感谢目前为止的所有反馈(非常棒)。所以看起来我可以使用卸载部分中的{app} *。*指令删除所有内容。看起来每个人都在反对它。 所以问题现在变成(我想知道这是否应该是一个全新的问题)在卸载过程中我们可以问用户'你想要删除与此相关的所有项目文件吗?应用?'如果他们回答是,则运行卸载{app} *。* piece?
谢谢 -
答案 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}"