shfileoperation 移动删除拷贝文件

来源:互联网 发布:ddg1000数据 编辑:程序博客网 时间:2024/04/30 22:22

SHFileOperation是一种外壳函数,用它可以实现各种文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。使用SHFileOperation()函数时只要填写该专用结构--SHFILEOPSTRUCT,告诉Windows执行什么样的操作,以及其它重要信息就行了。SHFileOperation()的特别之处在于它是一个高级外壳函数,不同于低级文件处理。当调用SHFileOperation操作文件时,相应的外壳拷贝处理器(如果有的话)被调用。

=============================================
函数原型:
int SHFileOperation( _Inout_ LPSHFILEOPSTRUCT lpFileOp);
需要的库文件:
#include <Shlwapi.h>
#pragma comment (lib,"Shlwapi.lib")
参数
lpFileOp : 一个指向SHFILEOPSTRUCT结构的指针
返回值:
返回0成功,
SHFILEOPSTRUCT结构说明
typedef struct _SHFILEOPSTRUCT {
HWND hwnd;
UINT wFunc;
PCZZTSTR pFrom;
PCZZTSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
PCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

  hwnd; //父窗口句柄, 0为桌面
wFunc; 功能标识
FO_COPY 复制
FO_DELETE 删除
FO_MOVE 移动
FO_RENAME 重命名
pFrom 源文件或者源文件夹,(source file)
pTo 目的文件或文件夹 (destination)
fFlags 控制文件的标志位
FOF_ALLOWUNDO 准许撤销
FOF_CONFIRMMOUSE 没有被使用,,,
FOF_FILESONLY
通配符的文件名( *.* )只对文件(不是文件夹)进行操作。
FOF_MULTIDESTFILES
The pTo member specifies multiple destination files (one for each source file in pFrom)
rather than one directory where all source files are to be deposited.
(不知道怎么翻译过来,大家体验一下精髓)
FOF_NOCONFIRMATION 不出现任何对话框
FOF_NOCONFIRMMKDIR 创建文件夹的时候不用确认
FOF_NO_CONNECTED_ELEMENTS
Version 5.0适用,,不移动连接文件(connected files),只移动特定文件
FOF_NOCOPYSECURITYATTRIBS
Version 4.71适用,,复制移动文件的时候不复制安全属性,而是为文件指定新的安全属性
FOF_NOERRORUI 如果发生错误, 不要 显示对话框给用户
FOF_NORECURSEREPARSE 没有被使用
FOF_NORECURSION 不递归目录
FOF_NO_UI
Windows Vista中,默默的进行操作,不给用户呈现任何UI。
这相当于FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI
|FOF_NOCONFIRMMKDIR 。
FOF_RENAMEONCOLLISION 移动复制的时候如果名字重名,自动分配新名字
FOF_SILENT 不显示进度条提示框
FOF_SIMPLEPROGRESS 显示一个进度条,但不显示单个文件名,
FOF_WANTMAPPINGHANDLE
如果指定了FOF_RENAMEONCOLLISION,说明此时是在重命名,
分配一个名称映射对象,其中包含他们的旧的和新的名字到hNameMappings成员。
如果不再使用,需要用SHFreeNameMappings释放。
FOF_WANTNUKEWARNING
当一个文件被永久删除的时候,弹出警告框
===================

BOOL DeleteFolder(LPCTSTR lpszPath) 
{ 
  SHFILEOPSTRUCT FileOp; 
  ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));

  FileOp.fFlags = FOF_NOCONFIRMATION; 
  FileOp.hNameMappings = NULL; 
  FileOp.hwnd = NULL; 
  FileOp.lpszProgressTitle = NULL; 
  FileOp.pFrom = lpszPath; 
  FileOp.pTo = NULL; 
  FileOp.wFunc = FO_DELETE; 

  return SHFileOperation(&FileOp) == 0;
}

  这是网上找的一段代码,但是在删除目录时总是说无法读取源文件或磁盘。但是目录确实存在。

  查了查MSDN,网上看到别人也有同样的问题,看看他们的解答。原来SHFileOperation中的pFrom可以表示多个路径,各个路径之间以'\0'分隔,最后以'\0\0'(即连续的两个'\0')结束,

于是改了过来。可是还是不行。

  去掉路径最后的一个'\'("c:\\data\\"改为"c:\\data"),成功。

 下面这个函数需要注意同样的问题。

BOOL CopyFolder(LPCTSTR lpszFromPath,LPCTSTR lpszToPath)
{
    SHFILEOPSTRUCT FileOp; 
    ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
    
    FileOp.fFlags = FOF_NOCONFIRMATION ; 
    FileOp.hNameMappings = NULL; 
    FileOp.hwnd = NULL; 
    FileOp.lpszProgressTitle = NULL; 
    FileOp.pFrom = lpszFromPath; 
    FileOp.pTo = lpszToPath; 
    FileOp.wFunc = FO_COPY; 
    
    return SHFileOperation(&FileOp) == 0;
}


0 0
原创粉丝点击