2017-07-21 58 views
1

我知道FileCopy功能可用於在[Code]部分複製文件,並能正常工作對於大多數的目的。但是,有沒有辦法來調用本地Windows文件複製操作,使標準的Windows文件複製對話框,進度,剩餘時間等顯示(即同做Ctrl+C,其次爲Ctrl+V),這也將允許用戶取消或暫停複製操作中期過程?或者更好的是,有沒有辦法直接在[Code]部分複製類似的功能?Inno Setup的調用或複製本地Windows文件複製操作

+2

在Windows SHFileOperation()API(或更不容易IFileOperation)是你必須在代碼中調用來完成什麼。 –

回答

1

使用SHFileOperationFO_COPY

type 
    TSHFileOpStruct = record 
    hwnd: HWND; 
    wFunc: UINT; 
    pFrom: string; 
    pTo: string; 
    fFlags: Word; 
    fAnyOperationsAborted: BOOL; 
    hNameMappings: HWND; 
    lpszProgressTitle: string; 
    end; 

const 
    FO_COPY   = $0002; 
    FOF_NOCONFIRMATION = $0010; 

function SHFileOperation(lpFileOp: TSHFileOpStruct): Integer; 
    external '[email protected] stdcall'; 

procedure ShellCopyFile; 
var 
    FromPath: string; 
    ToPath: string; 
    FileOp: TSHFileOpStruct; 
begin 
    FromPath := 
    ExpandConstant('{src}\data1.dat') + #0 + 
    ExpandConstant('{src}\data2.dat') + #0; 
    ToPath := ExpandConstant('{app}') + #0; 

    FileOp.hwnd := WizardForm.Handle; 
    FileOp.wFunc := FO_COPY; 
    FileOp.pFrom := FromPath; 
    FileOp.pTo := ToPath; 
    FileOp.fFlags := FOF_NOCONFIRMATION; 

    if SHFileOperation(FileOp) <> 0 then 
    begin 
    MsgBox('Copying failed.', mbError, MB_OK); 
    end; 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssInstall then 
    begin 
    ShellCopyFile; 
    end; 
end; 

的代碼是Inno Setup的的Unicode版本。

enter image description here

+0

謝謝馬丁。這看起來非常完美。是否有可能通過它複製多個文件?它看起來像一次僅限於一個文件? –

+1

當然,這是可能的。請參閱['SHFILEOPSTRUCT'結構(https://msdn.microsoft.com/en-us/library/windows/desktop/bb759795.aspx)和我的編輯答案文檔。其實我以前的代碼有一個錯誤。您可以使用文件列表或通配符爲操作指定多個文件。 –