MFC Shell文件操作SHFileOperation

外壳函数(Shell)--------SHFileOperation  
Copies, moves, renames, or deletes a file system object.文件复制、移动、重命名或者删除

int  SHFileOperation(
  __in  LPSHFILEOPSTRUCT lpFileOp
);

其参数lpFileOp是一个指向SHFILEOPSTRUCT结构的指针,该结构定义如下:

typedef  struct  _SHFILEOPSTRUCT {
  HWND         hwnd;                                      //显示文件操作时状态信息的对话框的窗口句柄
  UINT         wFunc;                                       //操作文件的方式,如复制、删除、重命名等
  LPCTSTR      pFrom;                                    //操作文件的源位置
  LPCTSTR      pTo;                                        //操作文件的目的位置
  FILEOP_FLAGS fFlags;                                //控制文件操作的标志
  BOOL          fAnyOperationsAborted;           //指示操作文件时是否有中断发生
  LPVOID       hNameMappings;                     //文件映射类句柄
  LPCTSTR      lpszProgressTitle;                    //带有进度条控件的文件信息对话框的标题
}  SHFILEOPSTRUCT,  * LPSHFILEOPSTRUCT;

注意,该结构中pFrom和pTo成员类型虽然是LPCTSTR,但是因为这个缓冲区内有时需要存放多个文件名,所以其中的每一个字符串都要以一个NULL结束,而整个字符串的结束是以连续的两个NULL。鉴于此,当直接将一个CString对象赋予这两个成员时,必须在末尾加上一个NULL,比如可以str.Insert(str.GetLength()+1,'/0')(这里的str为一个CString对象),否则将会出错。

以下代码摘自《精通MFC程序设计》第十四章,简单描写Shell文件操作步骤。
步骤一:添加成员变量

public :
    //定义外壳结构
    SHFILEOPSTRUCT fileOpStruct;
    //操作索引
    int  iIndex;

步骤二:消息响应

void  CShellOperation:: Onexecute()  
{
    // TODO: Add your control notification handler code here
    UpdateData( FALSE );
    DWORD  errorCode;
    //错误提示消息
    CString strMsg, strHint;
    CString strPre, strNxt;
    //源文件目的文件路径信息
    CString strTem1, strTem2;
    strTem1= m_sourcePath;
    strTem2= m_desPath;
    //由于fileOpStruct.pFrom的特殊要求,其必须以null结尾,否则不会成功
    //故这里需要在尾部加上null字符
    m_sourcePath.Insert( m_sourcePath.GetLength()+ 1 ,'/0' );
    m_desPath.Insert( m_desPath.GetLength()+ 1 ,'/0' );
    fileOpStruct.pFrom= m_sourcePath;
    fileOpStruct.pTo= m_desPath;
    int  k= m_desPath.GetLength();
    switch ( iIndex)
    {
        case  0 ://复制
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "中!" ;
                strPre= strPre+ strTem1+ "复制到" + strTem2+ strNxt;
                strHint= "复制被中断" ;
                strMsg= "复制出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_COPY;
                break ;
            }
        case  1 ://删除
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "删除!" ;
                strPre= strPre+ strTem1+ strNxt;
                strHint= "删除被中断" ;
                strMsg= "删除出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_DELETE;
                break ;
            }
        case  2 ://移动
            {
                //准备提示信息
                strPre= "将文件" ;
                strNxt= "中!" ;
                strPre= strPre+ strTem1+ "移动到" + strTem2+ strNxt;
                strHint= "移动被中断" ;
                strMsg= "移动出错,其代码为:" ;
                //填充结构的成员
                fileOpStruct.lpszProgressTitle= strPre;
                fileOpStruct.wFunc= FO_MOVE;
                break ;
            }
        default :
            break ;
    }

    //填充结构成员
    fileOpStruct.fFlags= FOF_SIMPLEPROGRESS;    
    int  res= SHFileOperation(& fileOpStruct);
    errorCode= GetLastError();
    if ( fileOpStruct.fAnyOperationsAborted== TRUE )
    {
        //提示中断信息
        AfxMessageBox( strHint);
    }
    else
    {
        //如果操作出错
        if ( res!= 0 )
        {
            CString strTem;
            strTem.Format( "%s%d" , strMsg, errorCode);
            AfxMessageBox( strMsg);
        }
    }
    //返回
    return ;
}

步骤三:初始化

BOOL  CShellOperation:: OnInitDialog()  
{
    CDialog:: OnInitDialog();   
    //初始化操作类别索引
    iIndex= 0 ;
    //其他初始化
    fileOpStruct.hwnd= GetSafeHwnd();
    return  TRUE ;   // return TRUE unless you set the focus to a control
                  // EXCEPTION: OCX Property Pages should return FALSE
}

以上只是大概步骤,具体详细参见书本,或者参见代码。代码:http://download.csdn.net/source/2315687

相关资料:

1.http://msdn.microsoft.com/en-us/library/bb759795%28v=VS.85%29.aspx
2.http://hi.baidu.com/libinbluewolf/blog/item/60a5e235d76868b0d1a2d3b1.html
3.http://blog.sina.com.cn/s/blog_53cba9ad0100dcxi.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值