如何使用Inno Setup提取ZIP压缩包内子文件夹中的文件
Inno Setup 解压zip忽略外层目录并删除原压缩包方案
修改后完整代码如下:
[Code] procedure InitializeWizard; begin ForceDirectories(ExpandConstant('{localappdata}\folder-A\app\folder-B')) end; const SHCONTCH_NOPROGRESSBOX = 4; SHCONTCH_RESPONDYESTOALL = 16; procedure unzip(ZipFile, TargetFldr: variant); var shellobj: variant; SrcFldr, DestFldr: variant; shellfldritems: variant; begin if FileExists(ZipFile) then begin if not DirExists(TargetFldr) then if not ForceDirectories(TargetFldr) then begin MsgBox('Can not create folder '+TargetFldr+' !!', mbError, MB_OK); Exit; end; shellobj := CreateOleObject('Shell.Application'); // 直接指向zip内的project-folder子目录,获取其下所有内容 SrcFldr := shellobj.NameSpace(ZipFile + '\project-folder'); DestFldr := shellobj.NameSpace(TargetFldr); shellfldritems := SrcFldr.Items; DestFldr.CopyHere( shellfldritems, SHCONTCH_NOPROGRESSBOX or SHCONTCH_RESPONDYESTOALL); end; procedure CurStepChanged(CurStep: TSetupStep); var zipPath: string; begin if CurStep = ssPostInstall then begin zipPath := ExpandConstant('{app}\example.zip'); unzip(zipPath, ExpandConstant('{app}\')); // 等待2秒确保异步拷贝完成,压缩包体积大可以适当调大毫秒数 Sleep(2000); // 删除原压缩包 DeleteFile(zipPath); end; end;
修改说明:
- 解压路径调整:原来的代码是将整个zip包的内容(包含外层
project-folder目录)直接解压到安装根目录,修改后直接读取zip包内project-folder下的所有文件/目录进行解压,最终安装根目录下不会生成多余的project-folder层 - 压缩包自动删除:解压完成后新增删除逻辑,前面加的等待是为了兼容
CopyHere接口的异步特性,避免还没解压完就删除压缩包导致解压失败
内容的提问来源于stack exchange,提问作者Uncle Bob
相关产品推荐
相关产品推荐

