shfileoperation 提示无法删除文件的有关问题

转载地址: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");
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
API功能详解: 使用API函数SHFileOperation,这个函数可以同时拷贝、删除、改名或移动多个文件,甚至整个目录。如果你愿意,还可以显示相应的动画对话框,功能十分强大。SHFileOperation的参数是一个SHFILEOPSSTRUCT结构。这个结构中各成员的含义如下: - hwnd - 显示文件操作对话框的窗口句柄 - wFunc - 表示要进行的操作,可以取以下值: - FO_COPY - 拷贝文件。所要拷贝的文件由pFrom成员指定,目的地址有pTo成员指定。 - FO_DELETE - 删除pFrom指定的文件。(pTo 被忽略。) - FO_MOVE - 移动文件。所要移动的文件由pFrom成员指定,目的地址有pTo成员指定。 - FO_RENAME - 改名pFrom指定的文件。 - pFrom - 指定文件名的缓冲区的地址。必须以Chr(0)结尾。如果包括多个文件以Chr(0)分割。 - pTo - 指定目的文件名或目录的缓冲区的地址。必须以Chr(0)结尾。如果使用了FOF_MULTIDESTFILES标志,可以包括多个文件名,文件名之间以Chr(0)分割。 - fFlags - 标志: - FOF_ALLOWUNDO - 允许恢复 - FOF_FILESONLY - 如果使用了*.*,只操作文件。 - FOF_MULTIDESTFILES - pTo成员可以为多个目的文件。 - FOF_NOCONFIRMATION - 不显示确认对话框。 - FOF_NOCONFIRMMKDIR - 不确认是否建立目录。 - FOF_NOERRORUI - 如果有错误,不显示用户界面。 - FOF_RENAMEONCOLLISION - 如果目的文件已经存在,给要处理的文件一个新名字。 - FOF_SILENT - 不显示进度对话框。 - FOF_SIMPLEPROGRESS - 显示进度框,但不显示文件名。 - fAnyOperationsAborted -如果用户退出,该成员为TRUE,否则为FALSE。 - lpszProgressTitle - 进度框的标题,只有选择了FOF_SIMPLEPROGRESS标志才有效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值