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
、GetAnyOperationsAborted和PerformOperations三个成员函数。函数CopyItem
设置将要复制的文件及目的位置,函数PerformOperations执行选择的操作,函数GetAnyOperationsAborted 返回执行是否被取消。
CopyItem声明如下:
所以首先要根据跟定文件路径创建两个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:这个函数的目的文件位置必须是存在的。虽然MSDN上说不调用IFileOperation.SetOperationFlags函数,操作的默认标志是FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR。但我还不知怎么创建一个IShellItem接口对象与一个不存在的文件夹关联,所以使用该函数需确保目的文件夹存在,而使用API函数SHFileOperation实现复制文件时显示进度对话框介绍的函数可以自动创建目录。这一点也是我还未弄明白的,如有知道的请不吝赐教!
关于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;
测试结果
注1:这个函数的目的文件位置必须是存在的。虽然MSDN上说不调用IFileOperation.SetOperationFlags函数,操作的默认标志是FOF_ALLOWUNDO | FOF_NOCONFIRMMKDIR。但我还不知怎么创建一个IShellItem接口对象与一个不存在的文件夹关联,所以使用该函数需确保目的文件夹存在,而使用API函数SHFileOperation实现复制文件时显示进度对话框介绍的函数可以自动创建目录。这一点也是我还未弄明白的,如有知道的请不吝赐教!
相关文章推荐
- IFileOperation实现复制文件时显示进度对话框
- 项目总结(三)——复制文件时显示进度对话框
- VC实现显示文件复制的进度
- 使用多线程实现文件的复制功能,并在控制台显示复制的进度,进度以百分比表示。
- 项目总结(三)——复制文件时显示进度对话框
- Qt 实现文件复制 界面有进度条(根据文件大小)显示复制进度,
- [C#]实现文件复制[更新]实时显示进度条
- WPF调用线程(二)复制文件并显示进度条
- 封装CopyFileEx函数,实现文件复制中的暂停,控速,获取进度。
- C#下载文件(可显示进度)的方法实现
- 使用C#在进度条中显示复制文件的进度
- 复制文件时显示进度
- 使用C#在进度条中显示复制文件的进度
- C#下载文件(可显示进度)的方法实现
- OKHTTP_三行代码实现文件下载(dialog显示进度)
- 利用jsp+Extjs实现动态显示文件上传进度
- JavaWeb项目实现文件上传动态显示进度
- iOS开发之网络编程--4、NSURLSessionDataTask实现文件下载(离线断点续传下载) <进度值显示优化>
- struts2实现文件上传显示进度条效果