2017-07-21 59 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)和我的编辑答案文档。其实我以前的代码有一个错误。您可以使用文件列表或通配符为操作指定多个文件。 –