在 Inno Setup 的自定义页面上使用进度条复制文件

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

我目前正在开发一个更新我们公司软件的程序。

我让用户在

CreateInputDirPage
中选择已安装程序的位置和备份位置。

目前我正在创建一个用于选择两个目录的掩码:

SelectPathPage := CreateInputDirPage(PreviousPageId,
  'Text 1',
  'Text 2.',
  'Text 3', False, 'New Folder');
  SelectPathPage.Add('Path to company program');
  SelectPathPage.Add('Path to backup folder');

然后我将使用现有文件验证第一个文件夹是否确实包含我们公司的程序。 现在我想将第一个选择复制到备份文件夹中的新子文件夹中。

我从另一个问题中找到了用于复制文件的示例代码:

DirectoryCopy(SelectPathPage.Values[0], SelectPathPage.Values[1]);

这似乎与

NextButtonClick
功能一起使用。

如何在带有进度条的

SelectPathPage
蒙版之后将文件夹及其文件夹内容复制到单独的蒙版上,并在复制完成后使下一步按钮可用。 它应该类似于带有进度条的“安装”掩码。 是否有可能在 Inno Setup 中的自定义掩码中创建类似的东西?

提前致谢

windows installation progress-bar inno-setup pascalscript
1个回答
2
投票

使用

CreateOutputProgressPage
创建进度页面。

并修改

DirectoryCopy
功能中的在Inno Setup中复制隐藏文件以推进页面进度

要计算总大小(设置进度条的最大值),代码需要

GetDirSize
函数从Inno Setup获取目录大小,包括子目录

[Code]

const
  ProgressRatio = 1024;

procedure DirectoryCopyWithProgress(
  SourcePath, DestPath: string; ProgressPage: TOutputProgressWizardPage);
var
  FindRec: TFindRec;
  SourceFilePath: string;
  DestFilePath: string;
  Size: Int64;
begin
  if FindFirst(SourcePath + '\*', FindRec) then
  begin
    try
      repeat
        if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
        begin
          SourceFilePath := SourcePath + '\' + FindRec.Name;
          DestFilePath := DestPath + '\' + FindRec.Name;
          ProgressPage.SetText(SourceFilePath, DestFilePath);
          if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          begin
            Size := Int64(FindRec.SizeHigh) shl 32 + FindRec.SizeLow;
            if FileCopy(SourceFilePath, DestFilePath, False) then
            begin
              Log(Format('Copied %s to %s with %s bytes', [
                SourceFilePath, DestFilePath, IntToStr(Size)]));
            end
              else
            begin
              Log(Format('Failed to copy %s to %s', [
                SourceFilePath, DestFilePath]));
            end;
          end
            else
          begin
            Size := 0;
            if DirExists(DestFilePath) or CreateDir(DestFilePath) then
            begin
              Log(Format('Created %s', [DestFilePath]));
              DirectoryCopyWithProgress(
                SourceFilePath, DestFilePath, ProgressPage);
            end
              else
            begin
              Log(Format('Failed to create %s', [DestFilePath]));
            end;
          end;

          Size := Size / ProgressRatio;
          ProgressPage.SetProgress(
            ProgressPage.ProgressBar.Position + Longint(Size),
            ProgressPage.ProgressBar.Max);
        end;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end
    else
  begin
    Log(Format('Failed to list %s', [SourcePath]));
  end;
end;

function SelectPathPageNextButtonClick(Sender: TWizardPage): Boolean;
var
  SourcePath: string;
  DestPath: string;
  ProgressPage: TOutputProgressWizardPage;
  TotalSize: Longint;
begin
  ProgressPage := CreateOutputProgressPage('Copying files...', '');
  SourcePath := TInputDirWizardPage(Sender).Values[0];
  DestPath := TInputDirWizardPage(Sender).Values[1];
  TotalSize := GetDirSize(SourcePath) / ProgressRatio;
  Log(Format('Total size is %s', [IntToStr(TotalSize)]));
  ProgressPage.SetProgress(0, TotalSize);
  ProgressPage.Show;
  try
    DirectoryCopyWithProgress(SourcePath, DestPath, ProgressPage);
  finally
    ProgressPage.Hide;
    ProgressPage.Free;
  end;
  Result := True;
end;

procedure InitializeWizard();
var
  SelectPathPage: TInputDirWizardPage;
begin
  SelectPathPage :=
    CreateInputDirPage(
      wpSelectDir, 'Text 1', 'Text 2.', 'Text 3', False, 'New Folder');
  SelectPathPage.Add('Path to company program');
  SelectPathPage.Add('Path to backup folder');
  SelectPathPage.OnNextButtonClick := @SelectPathPageNextButtonClick;
end;

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