1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);
如果执行成功返回0.
1 typedef struct _SHFILEOPSTRUCT { 2 HWND hwnd;//指向发送消息的窗口 3 UINT wFunc;//执行的操作 4 LPCTSTR pFrom;//源文件名 5 LPCTSTR pTo;//目标文件名 6 FILEOP_FLAGS fFlags;//操作与确认标识 7 BOOL fAnyOperationsAborted;//操作是否终止 8 LPVOID hNameMappings;//文件映射 9 LPCTSTR lpszProgressTitle;//进度条标题 10 } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
参数说明:
wFunc:要执行的操作
1.FO_COPY:复制 2.FO_DELETE:删除 3.FO_MOVE:移动 4.FO_RENAME:重命名
pFrom:源文件名
MSDN上说要以两个\0结束,所以一般的字符串必须还要加上一个\0
比如:
1 // 错误的用法 2 LPTSTR pszSource = L"C:\\Windows"; 3 4 // 正确的用法 5 LPTSTR pszSource = L"C:\\Windows\0";
对于CString,正确的用法是这样的
1 CString strSource("C:\\Windows"); 2 3 strSource += '\0';//注意必须是'\0'而不是"\0"!~!!
fFlags:执行标识
1 FOF_SILENT //不产生正在复制的对话框 2 FOF_NOCONFIRMMKDIR//如果目的目录不存在,就默认创建 3 FOF_NOCONFIRMATION //不出现确认文件替换对话框(默认替换原来的文i件) 4 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所指定的目录存在即可
1 BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib
如何判断同时存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
=====
如果出现弹出"无法删除 文件无法:读取源文件或磁盘文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI
=====
1 FOF_RENAMEONCOLLISION//有重复文件时自动重命名 2 3 FOF_ALLOWUNDO //将文件放入回收站,否则直接删除,一般这个最好做默认
使用该函数进行文件拷贝、移动或删除时,如果需要的时间很长,则程序会自动在进行的过程中出现一个无模式的对话框(Windows操作系统提供的文件操作对话框),用来显示执行的进度和执行的时间,以及正在拷贝、移动或删除的文件名,此时结构中的成员lpszProgressTitle显示此对话框的标题。fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:
1 FOF_FILESONLY:执行通配符,只执行文件; 2 3 FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复文件;
1 FOF_NOCONFIRMATION:在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。 2 3 FOF_NOERRORUI:设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。 4 5 FOF_RENAMEONCOLLISION:当已存在文件名时,对其进行更换文提示。 6 7 FOF_SILENT:不显示进度对话框。 8 9 FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函数返回正处于操作状态的实际文件列表,文件列表名柄保存在hNameMappings成员中。 SHFILEOPSTRUCT结构还包含一个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的文件的新旧路径。
在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle Bin。
例子:
1 CString strSrc("D:\\test1"); 2 CString strDes("D:\\test2"); 3 strSrc += '\0';//必须加'\0' 4 strDes += '\0'; 5 SHFILEOPSTRUCT FileOp; 6 FileOp.fFlags = FOF_ALLOWUNDO|FOF_MULTIDESTFILES|FOF_SIMPLEPROGRESS;// 7 CString str("正在进行中"); 8 str += '\0'; 9 FileOp.lpszProgressTitle = str; 10 FileOp.hwnd =m_hWnd; 11 FileOp.hNameMappings = NULL; 12 FileOp.pFrom = strSrc; // 13 FileOp.pTo = strDes; 14 FileOp.wFunc = FO_COPY; 15 16 BOOL bOk; 17 bOk = SHFileOperation(&FileOp); 18 if (!FileOp.fAnyOperationsAborted)//终止 19 { 20 if(bOk) 21 MessageBox(_T("操作出现错误!")); 22 else 23 MessageBox(_T("操作完成!")); 24 } 25 else 26 { 27 MessageBox(_T("操作已终止!"); 28 }