Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1612978
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 02:06:36

 MFC Shell文件操作SHFileOperation
分类: 2.1 VC++/MFC 385人阅读 评论(0) 收藏 举报

外壳函数(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
}

以上只是大概步骤,具体详细参见书本,或者参见代码。代码:

相关资料:

1. 
2.http://hi.baidu.com/libinbluewolf/blog/item/60a5e235d76868b0d1a2d3b1.html 
3.http://blog.sina.com.cn/s/blog_53cba9ad0100dcxi.html

阅读(739) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~