Inno Setup:如何让Folder.CopyHere在移动到下一个文件夹之前完成复制?

时间:2014-08-27 10:39:38

标签: inno-setup

这是早期问题的延续:here。 TLama提供了一个功能需要的解决方案: - Archive参数,作为现有存档文件的名称 - Folder参数可以是文件或文件夹的名称

呼叫是这样的:

CopyToArchive('C:\ExistingArchive.zip', 'C:\FolderToCopy\');

程序运行...

procedure CopyToArchive(const Archive, Content: string);
var
  Shell: Variant;
  Folder: Variant;
begin
  Shell := CreateOleObject('Shell.Application');
  Folder := Shell.NameSpace(Archive);
  Folder.CopyHere(Content);
end;

这是一个出色的解决方案,但行为与上一个问题中的VBScript略有不同。具体来说,此解决方案无法一次性复制我的文件。我得到一个无效的文件名错误,这与VBScript不会发生 - 我不知道为什么。我发现我可以通过修改代码来解决这个问题:

// ----------------------------------------------------------------------------
procedure CopyToArchive(); //(const Archive, Content: string);
var
  Shell: Variant;
  Folder: Variant;
  Archive, Content: string;
begin
 Shell := CreateOleObject('Shell.Application');
  Archive := ExpandConstant('{code:GetDataDir_S|0}') + '\myZipFile.zip';
  Folder := Shell.NameSpace(Archive);

  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\Folder1\');
  Folder.CopyHere(Content, $0100);
    sleep(1100) 
  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\Folder2\');
  Folder.CopyHere(Content, $0100); 
    sleep(1100)
  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\Folder3\');
  Folder.CopyHere(Content, $0100); 
    sleep(1100)
  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\File1.abc');
  Folder.CopyHere(Content, $0100); 
    sleep(1100)
  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\File2.abc');
  Folder.CopyHere(Content, $0100); 
    sleep(1100)
  Content := ExpandConstant('{code:GetDataDir_S|0}\Temp\File3.abc');
  Folder.CopyHere(Content, $0100);
    sleep(1100)

end;

但是,你可以看到很多等待。如果我减少睡眠时间,我会收到文件权限错误,所以我非常有信心在开始下一个操作之前我需要为文件提供时间来完成传输。

在VBScript中,解决方案是检查文件大小,只在它停止增长时继续。我为Inno Setup汇总的代码是:     瓦尔         max0,max1:整数;     开始         //初始化FileSizeCounters         max0:= 1         max1:= 0

    // Replace each Sleep(1100) line with the following:
    while  max0 > max1 do begin
    FileSize( Archive, max0 );
        sleep(500)
    FileSize( Archive, max1 );
    log(max1)
    end;

但它似乎不起作用 - 仍然崩溃。要停止崩溃,我需要将睡眠时间增加到至少1100毫秒,然后事件在某些测试运行时仍然会崩溃。是否有更好的方式来写这个?

1 个答案:

答案 0 :(得分:1)

解决方案是尽可能多地在zip容器中保留文件。然后使用TLama先前提供的解决方案选择性地复制剩余文件。这使得整个过程明显更快,并且比我最初的填充空拉链容器的尝试更加健壮。

我确实发现使用zip容器进行操作有点气质,当我在原始zip文件上执行以下步骤时似乎效果最佳:

  • 提取到文件夹
  • 打开zip文件
  • 选择所有&删除
  • 阻力&删除不改变的文件

通过Inno安装,然后使用无通知,恼人的asynch脚本和一定剂量的睡眠来复制在安装过程中修改过的剩余文件。

希望这有助于某人: - )

非常感谢TLama