您的位置:首页 > 运维架构

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

2011-09-18 16:34 549 查看
前面介绍了使用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实现复制文件时显示进度对话框介绍的函数可以自动创建目录。这一点也是我还未弄明白的,如有知道的请不吝赐教!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: