【问题标题】:Inno Setup: How to let Folder.CopyHere finish copying before moving to the next folder?Inno Setup:如何让 Folder.CopyHere 在移动到下一个文件夹之前完成复制?
【发布时间】:2014-08-27 10:39:38
【问题描述】:

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

调用是这样的:

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 最大值 := 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 毫秒和事件,然后它仍然会在某些测试运行中崩溃。有没有更好的写法?

【问题讨论】:

  • D'oh,所以调用是异步的。我应该注意到了。参考资料中还有一个烦人的评论:“没有通知调用程序以指示复制已完成。” 所以看起来唯一的方法是检查存档文件的大小一个循环。嗯,那我收回我对那个功能的赞美:-)
  • Humpf - 好吧,考虑到足够大的延迟,我想我已经设法让它工作了。我一直在我的网络驱动器上进行测试,它有点命中注定...... FWIW VBScript 在调试之外运行时摔倒了......感谢您的澄清,至少我可以停止尝试弄清楚它。干杯

标签: inno-setup


【解决方案1】:

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

我确实发现使用 zip 容器操作有点喜怒无常,当我对原始 zip 文件执行以下步骤时,它似乎效果最好:

  • 解压到文件夹
  • 打开压缩包
  • 全选并删除
  • 拖放不会更改的文件

通过 Inno 安装,然后使用无通知、烦人的异步脚本和一定的睡眠时间来复制在安装期间已修改的剩余文件。

希望这对某人有所帮助:-)

非常感谢 TLama

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多