转载地址:http://www.myexception.cn/vc-mfc/165844.html
shfileoperation 提示无法删除文件的问题
看了几篇关于用shfileoperation删除文件夹及其下文件的提问,大概知道是pFrom路径问题,但还是解决不了,奇怪的是有些提问人最后声称解决了,但也没有说出自己的代码错在哪里,郁闷,我解决了一定把完整代码贴出来,以下我的代码,请帮忙看看哪里有问题bool DeleteDirectory(CString strName)
{
SHFILEOPSTRUCT FileOp;
ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
FileOp.fFlags = FOF_NOCONFIRMATION;
FileOp.hNameMappings = NULL;
FileOp.hwnd = NULL;
FileOp.lpszProgressTitle = NULL;
FileOp.pFrom = strName.GetBuffer(strName.GetLength()+1);//
FileOp.pTo = NULL;
FileOp.wFunc = FO_DELETE;
strName.ReleaseBuffer();
return SHFileOperation(&FileOp) == 0;
}
------解决思路----------------------
应该是路径的问题,pFrom就是一指针,可是你在调用SHFileOperation之前已经给Release了
可以调用之后再Release,或者new 一个自己的buffer
------解决思路----------------------
You should use fully-qualified pathnames with this function. Using it with relative path-names is not thread-safe.
使用全路径
File deletion is recursive unless you set the FOF_NORECURSION flag in lpFileOp.
使用FOF_NORECURSION标志
------解决思路----------------------
单开一个内存,清空,把pForm指向这里,把内容拷进去
SHFILEOPSTRUCT Op;
ZeroMemory(&Op, sizeof(Op));
TCHAR ToBuf[MAX_PATH];
TCHAR FromBuf[MAX_PATH];
ZeroMemory(ToBuf, sizeof(ToBuf));
ZeroMemory(FromBuf, sizeof(FromBuf));
lstrcpy(FromBuf, strDeleteFile);
Op.hwnd = NULL;
Op.pFrom = FromBuf;
Op.pTo = ToBuf;
Op.fFlags = FOF_NOCONFIRMATION | FOF_NOCONFIRMMKDIR | FOF_NOERRORUI;
Op.fAnyOperationsAborted = FALSE;
Op.hNameMappings = NULL;
Op.lpszProgressTitle = NULL;
Op.wFunc = FO_DELETE;
SHFileOperation(&Op);
------解决思路----------------------
有两个地方注意一下,1是你的路径的数组里面,结束的\0必须有两个以上,一个不可以的,3楼的方法可以解决这个问题。
2是你传的路径,不要有\结束,比如"c:\\mytest\\"这样不行,要写成"c:\\mytest"
===============================================================================
Win32外壳API文件操作
利用Win32外壳可实现对文件的文件的拷贝、更名、移动及删除等,并且可以支持通配符(如*和?),也可
以直接对一个目录或目录树进行操作。直接调用Windows操作系统中的外壳,处理过程与Windows95/98/NT中的处理过程是一致的有利于我们在系统程序设计中保持与操作系统的一致性。同时由于在文件处理中它是直接调用Windows API函数,因此不需要其它应用程序动态链接库DLL的支持。
一、 原理与结构
Windows95/NT中提供了一个API函数SHFileOperation(),它只有一个指向SHFILEOPSTRUCT结构的参数。SHFileOperation()函数的原形如下:
WINSHELLAPI int WINAPI SHFileOperation(LPSHFILEOPSTRUCT lpFileOp);
LPSHFILEOPSTRUCT结构包含有进行文件操作的各种信息,其具体的结构如下:
typedef struct _SHFILEOPSTRUCT{
HWND hwnd; //消息窗口,指向发送消息的窗口
UINT wFunc; //操作类型
LPCSTR pFrom; //源文件及路径,多个文件名之间用NULL作为间隔,并且可以支持通配符*和?。
LPCSTR pTo; //目标文件及路径
FILEOP_FLAGS fFlags; //操作与确认标志
BOOL fAnyOperationsAborted; //操作选择位
LPVOID hNameMappings; //文件映射
LPCSTR lpszProgressTitle; //进度窗口标题
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;
说明:
pFrom和pTo:
源(目标)文件及路径,多个文件名之间用NULL作为间隔,并且可以支持通配符*和?。 如:
char pFrom[]="c:\\windows\\command\0c:\\dos\\himem.sys\0"
表示对c:\windows\command目录下的所有文件和c:\dos\himem.sys文件进行操作。'\\'是C语言中的'\'的转义符,'\0'则是NULL。
wFunc:
指将要进行的操作类型:FO_COPY(拷贝文件pFrom到pTo 的指定位置)、FO_RENAME(将pFrom的文件名更名为pTo的文件名)、FO_MOVE(将pFrom的文件移动到pTo的地方)、FO_DELETE(删除pFrom指定的文件)。
lpszProgressTitle:
在进行文件拷贝、移动或删除时,如果需要的时间很长,则会在进行的过程中出现一个无模式的对话框,可以显示执行的进度和执行的时间,以及正拷贝移动或删除的文件名,成员lpszProgressTitle显示此对话框的标题。
fFlags: 是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识及其组合:
FOF_FILESONLY:不执行通配符,只执行文件。
FOF_ALLOWUNDO:保存 UNDO信息,以便恢复。
FOF_NOCONFIRMATION: 在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。
FOF_NOERRORUI: 设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。
FOF_RENAMEONCOLLISION: 当已存在文件名时,对其进行更换文件名提示。
FOF_SILENT: 不显示进度对话框。
FOF_WANTMAPPINGHANDLE: 要求SHFileOperation()函数返回正处于操作状态的实际文件列表,文件列表名柄保存在hNameMappings成员中。SHFILEOPSTRUCT将包含一个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的文件的新旧路径。
二、文件复制的实例
void OnFilecopy()
{
int nOk;
char strSrc[]="e:\\temp\0"; //设置源路径
char strDst[]="e:\\temp1\0"; //设置目的路径
char strTitle[]="File copying"; //进度题头
SHFILEOPSTRUCT FileOp;
FileOp.hwnd=m_hWnd;
FileOp.wFunc=FO_COPY; //设置文件拷贝
FileOp.pFrom=strSrc;
FileOp.pTo=strDst;
FileOp.fFlags=FOF_ALLOWUNDO;
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle;
nOk=SHFileOperation(&FileOp);
if(nOk)
TRACE("There is an error: %d\n",nOk);
else
TRACE("SHFileOperation finished successfully\n");
if(FileOp.fAnyOperationsAborted)
TRACE("Operation was aborted!\n");
}