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