2014-08-27 22 views
1

這是以前問題的延續: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毫秒,然後事件在某些測試運行時仍然崩潰。有沒有更好的方法來寫這個?

+0

D'哦,所以調用是異步的。我應該注意到它。在參考文獻中還有一個令人討厭的評論:*「沒有通知給調用程序以表明副本已經完成。」*所以看起來似乎唯一的辦法就是在循環中檢查存檔文件的大小。嗯,然後我收回我對此功能的讚美:-) – TLama 2014-08-27 10:51:22

+0

Humpf - 好吧,考慮到足夠的延遲,我想我已經設法使它工作。我一直在測試我的網絡驅動器,並且它有點碰巧和小姐...當VBScript在調試之外跑了時,它會崩潰...感謝澄清,至少我可以停止嘗試弄清楚它。乾杯 – SlowLearner 2014-08-27 13:09:56

回答

1

解決方案是將盡可能多的文件保留在zip容器中。然後使用TLama早期提供的解決方案有選擇地複製剩餘的文件。這使得整個過程比我最初嘗試填充一個空的拉鍊容器的速度快得多,並且顯着更強大。

我確實發現,隨着壓縮容器操作是有點喜怒無常,它似乎最好的工作,當我在我原來的zip文件執行以下步驟:

  • 解壓到一個文件夾
  • 打開壓縮文件
  • 選擇所有&刪除不改變
  • 拖&文件拖放

通過Inno安裝,然後使用沒有通知,惱人的異步腳本和一定劑量的睡眠來複制在安裝過程中被修改的剩餘文件。

希望這可以幫助別人:-)

非常感謝TLama

相關問題