這是以前問題的延續:here。其中一個功能需要TLama提供瞭解決方案: - 歸檔參數是一個現有歸檔文件 的名字 - 文件夾參數可以是文件或文件夾Inno Setup:如何讓Folder.CopyHere在移動到下一個文件夾之前完成複製?
呼叫的名字是這樣的:
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一起拉的代碼是: Var max0,max1:integer; 開始 //初始化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毫秒,然後事件在某些測試運行時仍然崩潰。有沒有更好的方法來寫這個?
D'哦,所以調用是異步的。我應該注意到它。在參考文獻中還有一個令人討厭的評論:*「沒有通知給調用程序以表明副本已經完成。」*所以看起來似乎唯一的辦法就是在循環中檢查存檔文件的大小。嗯,然後我收回我對此功能的讚美:-) – TLama 2014-08-27 10:51:22
Humpf - 好吧,考慮到足夠的延遲,我想我已經設法使它工作。我一直在測試我的網絡驅動器,並且它有點碰巧和小姐...當VBScript在調試之外跑了時,它會崩潰...感謝澄清,至少我可以停止嘗試弄清楚它。乾杯 – SlowLearner 2014-08-27 13:09:56