You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:06:07