SHFileOperation 演示






2.76/5 (16投票s)
2005年5月4日
2分钟阅读

101053

10
Shell编程的简单介绍。
引言
本文是一个非常简单的文章,说明了SHFileOperation
的基本用法以及如何使用它来提供多重复制。
使用代码
该代码非常简单,是对SHFileOperation
的初步解释,说明了如何将多个文件和多个文件夹从多个源复制到多个目标。在开始解释代码之前,让我向您展示SHFileOperation
的原型以及传递给它的结构
int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
LPSHFILEOPSTRUCT
正如您所假设的那样是指向SHFILEOPSTRUCT
的指针,该结构定义如下
typedef struct _SHFILEOPSTRUCT { HWND hwnd; UINT wFunc; LPCSTR pFrom; LPCSTR pTo; FILEOP_FLAGS fFlags; BOOL fAnyOperationsAborted; LPVOID hNameMappings; LPCSTR lpszProgressTitle; } SHFILEOPSTRUCT, FAR* LPSHFILEOPSTRUCT;
我不会详细介绍此结构的细节,可以在MSDN中轻松找到它。 此结构中真正让我们关心的是pFrom
和pTo
,它们分别指向包含源文件/文件夹和目标文件/文件夹的字符串。 老实说,我想将它们视为字符串列表,因为它们可以携带多个由'\0'(null)分隔的源文件/文件夹,并且最后一个元素应后跟'\0\0'(双null)。
为了使它尽可能简单,所有代码都围绕填充两个字符串列表展开。
LPCSTR pFrom; LPCSTR pTo;
pFrom
是由'\0'分隔并由'\0\0'终止的源路径的字符串指针。
pTo
是由'\0'分隔并由'\0\0'终止的目标路径的字符串指针。
因此,基本上,我们要做的就是填写这两个列表并将该结构传递给SHFileOperation
,该函数将处理所有细节。 当然,我们必须设置适当的标志才能使其正常工作。 典型的标志设置如下
FOF_MULTIDESTFILES|FOF_NOCONFIRMMKDIR|FOF_NOCONFIRMATION
该代码已尽可能地保持简单。(所有代码都已添加到界面中-是的,我知道糟糕的设计:-P。)为了使它尽可能简单并且不会迷失在细节中,该代码已被很好地注释,但是,大多数编写的代码只是界面调整代码。 主要操作发生在以下函数中
void CMultiCopyDlg::OnBnClickedBtnCopy() { //Declirations and finlizations :-P //finilization is basically //adding the second null char '\0' //to the final termination of the string szDisFileLst+='\0'; szFileLst+='\0'; szDisDireLst+='\0'; szDirLst+='\0'; SHFILEOPSTRUCT SHFileOp,SHDirOp; if(bFileInList) { //The File Operation Structure ZeroMemory(&SHFileOp, sizeof(SHFILEOPSTRUCT)); SHFileOp.hwnd = NULL; SHFileOp.wFunc = FO_COPY; SHFileOp.pFrom = szFileLst; SHFileOp.pTo = szDisFileLst; SHFileOp.fFlags = FOF_MULTIDESTFILES; //The Copying Function SHFileOperation(&SHFileOp); } //case it was directory //this is hear just to show //the diffrence between flags for directories and files //and for future extenstions if(bDirInList) { //Directory Copying ZeroMemory(&SHDirOp, sizeof(SHFILEOPSTRUCT)); SHDirOp.hwnd = NULL; SHDirOp.wFunc = FO_COPY; SHDirOp.pFrom = szDirLst; SHDirOp.pTo = szDisDireLst; SHDirOp.fFlags = FOF_MULTIDESTFILES|FOF_NOCONFIRMMKDIR|FOF_NOCONFIRMATION; //The Copying Function SHFileOperation(&SHDirOp); } }
在填充完结构之后,我们所做的就是填充结构SHFILEOPSTRUCT
并将其发送到函数以执行。
下一步
嗯,这个函数还没有探索很多东西,而且在复制文件夹时存在一些尚未处理的错误。 该函数仅将源文件夹中的文件复制到目标文件夹,而不是将整个文件夹复制到目标文件夹中。
谢谢
感谢Dino Esposito的精彩著作《Visual C++ Windows Shell编程》和Ahmad Ismail关于多重复制的文章(基本上相同,但我想关注主要细节:-P)。