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