关于IFileOperation接口的成员介绍请参见http://msdn.microsoft.com/en-us/library/bb775771(v=VS.85).aspx。在此我们只使用CopyItem 、GetAnyOperationsAborted和PerformOperations三个成员函数。函数CopyItem 设置将要复制的文件及目的位置,函数PerformOperations执行选择的操作,函数GetAnyOperationsAborted 返回执行是否被取消。
CopyItem声明如下:
- //C++
- HRESULT CopyItem(
- [in] IShellItem *psiItem,
- [in] IShellItem *psiDestinationFolder,
- [in, unique] LPCWSTR pszCopyName,
- [in, unique] IFileOperationProgressSink *pfopsItem
- );
- //Delphi
- function CopyItem(const psiItem: IShellItem; const psiDestinationFolder: IShellItem;
- pszCopyName: LPCWSTR; const pfopsItem: IFileOperationProgressSink): HRESULT; stdcall;
所以首先要根据跟定文件路径创建两个IShellItem接口对象,在此由于已知路径故使用SHCreateItemFromParsingName函数,关于该函数的说明请参见 http://msdn.microsoft.com/en-us/library/bb762134(VS.85).aspx。在此我们使用SHCreateItemFromParsingName(PWideChar(strFrom),nil,IID_IShellItem,iFrom)可以获得要复制文件的IShellItem接口。同理可以获得目的文件夹的IShellItem接口。
第三个参数pszCopyName是新文件的名称,如果为nil(C++中为NULL) 则使用源文件名命名新文件。第四个参数pfopsItem是一个自定义文件操作过程监视接口,在此使用系统默认的显示过程,可将其设为nil。
完整代码如下:【注1】
- //
- //********************************************************************
- //功能:将strFrom路径指定的文件拷贝到strTo指定文件夹下
- //参数:(1)strFrom,指定源文件位置
- // (2)strTo,目的文件夹位置
- //返回值: 1,复制操作成功完成
- // 0,复制操作被取消
- // -1,复制操作执行失败
- //*********************************************************************
- function dlgCopyFiles(strFrom, strTo: string):Integer;
- var
- iFrom,iTo:IShellItem;
- ifOp:IFileOperation;
- hr:HRESULT;
- aborted:LongBool;
- begin
- Result:=-1;
- hr:=CoCreateInstance(CLSID_FileOperation,nil,CLSCTX_ALL,IID_IFileOperation,ifOp);
- if(Succeeded(hr))then
- begin
- if(SHCreateItemFromParsingName(PWideChar(strFrom),nil,IID_IShellItem,iFrom)=S_OK)then
- begin
- if(SHCreateItemFromParsingName(PWideChar(strTo),nil,IID_IShellItem,iTo)=S_OK)then
- begin
- ifOp.CopyItem(iFrom,iTo,nil,nil);
- ifOp.PerformOperations;
- aborted:=False;
- ifOp.GetAnyOperationsAborted(aborted);
- if(aborted)then Result:=0
- else Result:=1;
- end;
- end;
- end;
- end;