现在的位置: 首页 > 综合 > 正文

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

2018年04月11日 ⁄ 综合 ⁄ 共 2393字 ⁄ 字号 评论关闭
文章目录

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

       关于IFileOperation接口的成员介绍请参见http://msdn.microsoft.com/en-us/library/bb775771(v=VS.85).aspx。在此我们只使用CopyItem
GetAnyOperationsAbortedPerformOperations三个成员函数。函数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;

测试结果 

    

        


 注1:这个函数的目的文件位置必须是存在的。虽然MSDN上说不调用IFileOperation.SetOperationFlags函数,操作的默认标志是FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR。但我还不知怎么创建一个IShellItem接口对象与一个不存在的文件夹关联,所以使用该函数需确保目的文件夹存在,而使用API函数SHFileOperation实现复制文件时显示进度对话框介绍的函数可以自动创建目录。这一点也是我还未弄明白的,如有知道的请不吝赐教!

 

 

 

 

 

 

 

 

 

抱歉!评论已关闭.