IFileOperation实现复制文件时显示进度对话框

    前面介绍了 使用API函数SHFileOperation实现复制文件时显示进度对话框  ,这里顺便简单介绍下使用IFileOperation实现复制文件时显示进度对话框这一功能。接口IFileOperation是Windows用来替代SHFileOperation函数的,它提供了更强的功能和更安全的操作。由于很难找到关于IFileOperation的编程资料,只是稍微了解了下它的简单使用方法,个人觉得IFileOperation的功能应该是非常强大的,可惜很多方法的参数都不会使用。下面简单介绍利用IFileOperation接口怎么实现上述功能。

       关于IFileOperation接口的成员介绍请参见http://msdn.microsoft.com/en-us/library/bb775771(v=VS.85).aspx。在此我们只使用CopyItemGetAnyOperationsAbortedPerformOperations三个成员函数。函数CopyItem 设置将要复制的文件及目的位置,函数PerformOperations执行选择的操作,函数GetAnyOperationsAborted 返回执行是否被取消。

       CopyItem声明如下: 

  1. //C++  
  2. HRESULT CopyItem(  
  3.   [in]          IShellItem *psiItem,  
  4.   [in]          IShellItem *psiDestinationFolder,  
  5.   [in, unique]  LPCWSTR pszCopyName,  
  6.   [in, unique]  IFileOperationProgressSink *pfopsItem  
  7. );  

 

  1. //Delphi  
  2. function CopyItem(const psiItem: IShellItem; const psiDestinationFolder: IShellItem;   
  3.       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】

  1. //  
  2. //********************************************************************     
  3. //功能:将strFrom路径指定的文件拷贝到strTo指定文件夹下     
  4. //参数:(1)strFrom,指定源文件位置     
  5. //      (2)strTo,目的文件夹位置     
  6. //返回值:  1,复制操作成功完成     
  7. //        0,复制操作被取消     
  8. //       -1,复制操作执行失败        
  9. //*********************************************************************     
  10. function dlgCopyFiles(strFrom, strTo: string):Integer;  
  11. var  
  12. iFrom,iTo:IShellItem;  
  13. ifOp:IFileOperation;  
  14. hr:HRESULT;  
  15. aborted:LongBool;  
  16. begin  
  17.   Result:=-1;  
  18.   hr:=CoCreateInstance(CLSID_FileOperation,nil,CLSCTX_ALL,IID_IFileOperation,ifOp);  
  19.   if(Succeeded(hr))then  
  20.   begin  
  21.     if(SHCreateItemFromParsingName(PWideChar(strFrom),nil,IID_IShellItem,iFrom)=S_OK)then  
  22.     begin  
  23.        if(SHCreateItemFromParsingName(PWideChar(strTo),nil,IID_IShellItem,iTo)=S_OK)then  
  24.       begin  
  25.         ifOp.CopyItem(iFrom,iTo,nil,nil);  
  26.         ifOp.PerformOperations;  
  27.         aborted:=False;  
  28.         ifOp.GetAnyOperationsAborted(aborted);  
  29.         if(aborted)then Result:=0  
  30.         else Result:=1;  
  31.       end;  
  32.     end;  
  33.   end;  
  34. end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值