65.9K
CodeProject 正在变化。 阅读更多。
Home

SHFileOperation 演示

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.76/5 (16投票s)

2005年5月4日

2分钟阅读

viewsIcon

101053

downloadIcon

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中轻松找到它。 此结构中真正让我们关心的是pFrompTo,它们分别指向包含源文件/文件夹和目标文件/文件夹的字符串。 老实说,我想将它们视为字符串列表,因为它们可以携带多个由'\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)。

© . All rights reserved.