Inno Setup卸载器如何删除安装时用户指定的文件夹?
解决Inno Setup卸载时删除指定自定义路径的问题
你遇到的问题核心是:[UninstallDelete]段无法直接引用脚本变量或动态读取的INI配置,它只能处理固定常量或预定义路径。要实现卸载时删除用户指定的DataPath,得用代码动态读取配置并执行删除操作,具体步骤如下:
一、移除无效的[UninstallDelete]配置
先删掉你之前加的这段无效配置:
[UninstallDelete] Type: filesandordirs; Name: DataPath
二、添加卸载时的自定义处理代码
在脚本的[Code]段中,通过卸载事件触发路径读取和删除操作。以下是完整的代码实现,我会标注关键细节:
procedure CurUninstallStepChanged(CurStep: TUninstallStep); var ConfigPath: String; DataPath: String; begin // 选择在卸载核心步骤(usUninstall)执行删除,确保时机正确 if CurStep = usUninstall then begin // 1. 获取config.ini的绝对路径 ConfigPath := ExpandConstant('{app}\config.ini'); // 2. 从INI中读取用户指定的datapath // 注意:这里的Section名称要和你[INI]段里的完全一致(包括空格和等号) DataPath := GetIniString('connection = standard', 'datapath', '', ConfigPath); // 3. 处理路径:如果是相对路径,转换为基于{app}的绝对路径 if DataPath <> '' then begin if not IsAbsolutePath(DataPath) then begin DataPath := AddBackslash(ExpandConstant('{app}')) + DataPath; end; // 标准化路径,避免重复斜杠或格式问题 DataPath := ExpandConstant(DataPath); // 4. 确认路径存在后,删除整个目录及所有内容 if DirExists(DataPath) then begin // DelTree参数说明: // 参数1:目标路径;参数2:允许删除非空目录;参数3:删除目录本身;参数4:显示删除进度 DelTree(DataPath, True, True, True); end; end; end; end;
三、关键细节说明
- Section名称匹配:你的
[INI]段中Section写的是"connection = standard",所以读取时必须完全一致,不能写错。如果是配置时的笔误(比如应该是Section为"connection"、Key为"standard"),记得同步修改GetIniString的前两个参数。 - 相对路径处理:如果用户输入的是相对路径(比如
./data),代码会自动将其转换为基于{app}的绝对路径,避免删除错误的位置。 - 安全校验:先判断路径非空且存在,再执行删除操作,避免因配置缺失或路径不存在导致的报错。
内容的提问来源于stack exchange,提问作者tg24
相关产品推荐
相关产品推荐

