【发布时间】: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