如何下载并解压/提取用户在组件列表中选择的特定文件

问题描述 投票:0回答:1

希望标题已经足够清楚了,但为了更好地解释:我在

Select Components
页面 有大量选项可供选择(大约 1.4 GB 的 .png 文件),我的目标是减轻安装程序的编译大小通过让它将文件下载到
{tmp}
并在解压缩后安装。不幸的是,我在尝试遵循其他问题的答案时遇到了问题:

无论用户选择什么组件,都会下载所有文件,导致解压需要花费大量时间,而且不幸的是没有进度条可以反馈给用户。

———————————————————————————————————————————————

目前我的安装程序的所有

[Code]
(抱歉,太长了)

[Files]
// Test
Source: "{tmp}\packs\Sapphic_icons\Dead by Daylight\DeadByDaylight\Content\UI\Icons\README.txt"; DestDir: "{app}"; Components: sapphic; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: ExtractedFileNeedsInstallation

[Types]
Name: "sapphic"; Description: "Sapphic Pack";
Name: "custom"; Description: "Customized"; Flags: iscustom;

[Components]  
Name: "sapphic"; Description: "Sapphic Pack - WIP*"; Types: custom sapphic;

[Code]
{ —————————— Extraction Logging ———————————————————————————————————————— }
const
  NO_PROGRESS_BOX = 4;
  RESPOND_YES_TO_ALL = 16;
procedure UnZip(ZipPath, FileName, TargetPath: string); 
var
  Shell: Variant;
  ZipFile: Variant;
  Item: Variant;
  TargetFolder: Variant;
begin
  Shell := CreateOleObject('Shell.Application');

  ZipFile := Shell.NameSpace(ZipPath);
  if VarIsClear(ZipFile) then
    RaiseException(Format('Cannot open ZIP file "%s" or does not exist', [ZipPath]));

  Item := ZipFile.ParseName(FileName);
  if VarIsClear(Item) then
    RaiseException(Format('Cannot find "%s" in "%s" ZIP file', [FileName, ZipPath]));

  TargetFolder := Shell.NameSpace(TargetPath);
  if VarIsClear(TargetFolder) then
    RaiseException(Format('Target path "%s" does not exist', [TargetPath]));

  TargetFolder.CopyHere(Item, NO_PROGRESS_BOX or RESPOND_YES_TO_ALL);
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Extraction Handling ———————————————————————————————————————— }
function ExtractedFileNeedsInstallation: Boolean;
var 
  TargetPath: String; 
begin  
  TargetPath := ExpandConstant('{userappdata}')+'\App\packs';
  Result := not FileExists(TargetPath);
  Log(Format('ExtractedFileNeedsInstallation: %d', [Result]));  
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Download Progress ———————————————————————————————————————— }
var
  DownloadPage: TDownloadWizardPage;
function OnDownloadProgress(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;
begin
  if Progress = ProgressMax then
    Log(Format('Successfully downloaded file to {tmp}: %s', [FileName]));
  Result := True;
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Setup Wizard ———————————————————————————————————————— }
procedure InitializeWizard();
begin
{ Download Page }
  DownloadPage := CreateDownloadPage(SetupMessage(msgWizardPreparing), SetupMessage(msgPreparingDesc), @OnDownloadProgress);
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
{ —————————— Download Handling ———————————————————————————————————————— } 
function NextButtonClick(CurPageID: Integer): Boolean;
var  
  Temp: String;
begin
  if CurPageID = wpReady then begin
      if (not ExtractedFileNeedsInstallation) then
      begin
          Result := True;
      end
      else
      begin
          DownloadPage.Clear;
          DownloadPage.Add('https://www.dropbox.com/scl/fi/fautmpacdsl22h6y41jrv/packs.zip?rlkey=ul3kl1f9o3258yguitprisx6c&st=wwry4esv&dl=1', 'packs.zip', '');
          DownloadPage.Show;
          try
            try
              DownloadPage.Download;
              Temp := ExpandConstant('{tmp}');
              UnZip(Temp+'\packs.zip', 'packs', Temp);
              Result := True;
            except
              SuppressibleMsgBox(AddPeriod(GetExceptionMessage), mbCriticalError, MB_OK, IDOK);
              Result := False;
            end;
          finally
            DownloadPage.Hide;
          end;
      end;
  end else
    Result := True;
end; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //

———————————————————————————————————————————————

inno-setup pascalscript inno-setup-v6
1个回答
0
投票

您的代码仅包含单个 ZIP 文件下载和单个组件。哪些内容与您的主张不符。

无论如何,如果您只想下载每个假定组件的文件子集,则需要首先将下载内容拆分为单独的组件包。这甚至不是 Inno Setup 的问题。

然后您可以通过使用

WizardIsComponentSelected
查询选定的组件并添加相应的下载 URL,告诉 Inno Setup 仅下载您需要的软件包。

喜欢:

if WizardIsComponentSelected('component1') then 
  DownloadPage.Add('https://example.com/component1.zip', 'component1.zip', '');

if WizardIsComponentSelected('component2') then 
  DownloadPage.Add('https://example.com/component2.zip', 'component2.zip', '');

// ...
© www.soinside.com 2019 - 2024. All rights reserved.