1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);
如果执行成功返回0.
typedef struct _SHFILEOPSTRUCT { HWND hwnd; //指向发送消息的窗口 UINT wFunc; //执行的操作 LPCTSTR pFrom; //源文件名 LPCTSTR pTo; //目标文件名 FILEOP_FLAGS fFlags; //操作与确认标识 BOOL fAnyOperationsAborted; //操作是否终止 LPVOID hNameMappings; //文件映射 LPCTSTR lpszProgressTitle; //进度条标题 } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
参数说明:
wFunc: 要执行的操作
FO_COPY: 复制 FO_DELETE: 删除 FO_MOVE: 移动 FO_RENAME: 重命名
pFrom:源文件名
MSDN上说要以两个\0结束,所以一般的字符串必须还要加上一个\0
比如:
// 错误的用法 LPTSTR pszSource = L"C:\\Windows"; // 正确的用法 LPTSTR pszSource = L"C:\\Windows\0";
对于CString,正确的用法是这样的
CString strSource("C:\\Windows"); strSource += '\0';//注意必须是'\0'而不是"\0"
fFlags: 执行标识
FOF_SILENT //不产生正在复制的对话框 FOF_NOCONFIRMMKDIR //如果目的目录不存在,就默认创建 FOF_NOCONFIRMATION //不出现确认文件替换对话框(默认替换原来的文i件) FOF_NOERRORUI //不出现错误对话框
注:
注:最好不要同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因为FOF_NOCONFIRMMKDIR屏蔽了missing directory Error,但FOF_NOERROR又屏蔽了missing directory Error,那么在同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR时也阻止了新目录安静(没有用户确认要产生新目录的对话框)的产生!!那么如何同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
就必须先确认pTo所指定的目录存在即可
BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib
如何判断同时存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
=====
如果出现弹出"无法删除 文件无法:读取源文件或磁盘文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI
=====
FOF_RENAMEONCOLLISION //有重复文件时自动重命名 FOF_ALLOWUNDO //将文件放入回收站,否则直接删除,一般这个最好做默认
使用该函数进行文件拷贝、移动或删除时,如果需要的时间很长,则程序会自动在进行的过程中出现一个无模式的对话框(Windows操作系统提供的文件操作对话框),用来显示执行的进度和执行的时间,以及正在拷贝、移动或删除的文件名,此时结构中的成员lpszProgressTitle显示此对话框的标题。fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:
FOF_FILESONLY //执行通配符,只执行文件; FOF_ALLOWUNDO //保存UNDO信息,以便在回收站中恢复文件;
FOF_NOCONFIRMATION //在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。 FOF_NOERRORUI //设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。 FOF_RENAMEONCOLLISION //当已存在文件名时,对其进行更换文提示。 FOF_SILENT //不显示进度对话框。 FOF_WANTMAPPINGHANDLE
在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle
Bin。
例子:
CString strSrc("D:\\test1"); CString strDes("D:\\test2"); strSrc += '\0';//必须加'\0' strDes += '\0'; SHFILEOPSTRUCT FileOp; FileOp.fFlags = FOF_ALLOWUNDO|FOF_MULTIDESTFILES|FOF_SIMPLEPROGRESS;// CString str("正在进行中"); str += '\0'; FileOp.lpszProgressTitle = str; FileOp.hwnd =m_hWnd; FileOp.hNameMappings = NULL; FileOp.pFrom = strSrc; // FileOp.pTo = strDes; FileOp.wFunc = FO_COPY; BOOL bOk; bOk = SHFileOperation(&FileOp); if (!FileOp.fAnyOperationsAborted)//终止 { if(bOk) MessageBox(_T("操作出现错误!")); else MessageBox(_T("操作完成!")); } else { MessageBox(_T("操作已终止!"); }
版权声明:本文为博主原创文章,未经博主允许不得转载。