希望标题已经足够清楚了,但为了更好地解释:我在
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; // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // // //
———————————————————————————————————————————————
您的代码仅包含单个 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', '');
// ...