SHFileOperation的⽤法
在Windows的shellapi⽂件中定义了⼀个名为SHFileOperation()的外壳函数,它可以⽤来实现各种⽂件操作,例如⽂件的拷贝、删除和移动等,该函数使⽤起来⾮常简单,它只有⼀个指向SHFILEOPSTRUCT结构的参数。使⽤SHFileOperation()函数时只要填写该专⽤结构--SHFILEOPSTRUCT,告诉Windows执⾏什么样的操作,以及其它重要信息就⾏了。SHFileOperation()的特别之处在于它是⼀个⾼级外壳函数,不同于低级⽂件处理。当调⽤SHFileOperation操作⽂件时,相应的外壳拷贝处理器(如果有的话)被调⽤。如在删除某个⽂件时,SHFileOperation会将删除的⽂件放到Recycle Bin中。
  SHFileOperation()函数原型为:WINSHELLAPI int WINAPI SHFileOperation(LPSHFILESTRUCT lpFileOp);
  LPSHFILESTRUCT结构格式如下:
  Typedef struct _shFILEOPSTRUCT
  {
    HWND  hWnd;  //消息发送的窗⼝句柄;
    UINT   wFunc;  //操作类型
    LPCSTR  pFrom;   //源⽂件以及路径
    LPCSTR  pTo;    //⽬标⽂件以及路径
    FILEOP_FLAGS  fFlags;  //操作选择位
    LPVOID  hNameMapping;  //⽂件映射
    LPCSTR  lpszProgressTitle;  //⽂件操作进度窗⼝标题
  }SHFILEOPSTRUCT,FAR* LPSHFILEOPSTRUCT;
在这个结构中,hWnd是指向发送消息的窗⼝句柄,pFrom与pTo是进⾏⽂件操作的源⽂件名和⽬标⽂件名,它包含⽂件的路径,对应单个⽂件的路径字符串,或对于多个⽂件,必须以NULL作为字符串的结尾或⽂件路径名之间的间隔,否则在程序运⾏的时候会发⽣错误。另
外,pFrom和pTo都⽀持通配符*和?,这⼤⼤⽅便了开发⼈员的使⽤。例如,源⽂件或⽬录有两个,则应是:char
pFrom[]="d:/Test1/0d://0",它表⽰对要D:盘Test1⽬录下的所有⽂件和D:盘上的⽂件进⾏操作。字符串中的""是C语⾔中
的''的转义符,'/0'则是NULL。wFunc 是结构中的⼀个⾮常重要的成员,它代表着函数将要进⾏的操作类型,它的取值为如下:
  ·FO_COPY: 拷贝⽂件pFrom到pTo 的指定位置。
  ·FO_RENAME: 将pFrom的⽂件名更名为pTo的⽂件名。
  ·FO_MOVE: 将pFrom的⽂件移动到pTo的地⽅。
  ·FO_DELETE:删除pFrom指定的⽂件。
使⽤该函数进⾏⽂件拷贝、移动或删除时,如果需要的时间很长,则程序会⾃动在进⾏的过程中出现⼀个⽆模式的对话框(Windows操作系统提供的⽂件操作对话框),⽤来显⽰执⾏的进度和执⾏的时间,以及正在拷贝、移动或删除的⽂件名,此时结构中的成员lpszProgressTitle显⽰此对话框的标题。fFlags是在进⾏⽂件操作时的过程和状态控制标识。它主要有如下⼀些标识,也可以是其组合:
  ·FOF_FILESONLY:执⾏通配符,只执⾏⽂件;
  ·FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢复⽂件;
  ·FOF_NOCONFIRMATION:在出现⽬标⽂件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则⾃动确认,进⾏覆盖,不出现对话框。
  ·FOF_NOERRORUI:设置此项后,当⽂件处理过程中出现错误时,不出现错误提⽰,否则会进⾏错误提⽰。   
  ·FOF_RENAMEONCOLLISION:当已存在⽂件名时,对其进⾏更换⽂提⽰。
  ·FOF_SILENT:不显⽰进度对话框。
  ·FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函数返回正处于操作状态的实际⽂件列表,⽂件列表名柄保存在hNameMappings成员中。
字符串函数 通配符 vb  ·SHFILEOPSTRUCT结构还包含⼀个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的⽂件的新旧路径。
同时也有⼀个重要的应⽤就是:
在进⾏⽂件操作时,可以使⽤CFile类中的Remove()函数来删除⼀个⽂件,但是这样的操作将永久性的删除该⽂件,不能在必要的时候再恢复该⽂件,解决这个问题的唯⼀⽅法就是把⽂件送到Windows系
统中的回收站(Recycle Bin)⾥⾯,⽽不是简单的永久性删除它,这样⽤户就可以在必要的时候恢复这个⽂件。⽤这个函数实现编程来实现Windows回收站的⽂件存取操作。
在使⽤该函数删除⽂件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的⽂件拷到Recycle Bin,从⽽使⽤户可以撤销删除操作。需要注意的是,如果pFrom设置为某个⽂件名,⽤FO_DELETE标志删除这个⽂件并不会将它移到Recycle Bin,甚⾄设置FOF_ALLOWUNDO标志也不⾏,在这⾥你必须使⽤全路径名,这样SHFileOperation才会将删除的⽂件移到Recycle Bin。
代码如下:
 void CFileOperationView::OnFileDelete()
  {
   int nOk;
   char strSrc[]="d:/Vb/0";//源⽂件路径;
   char strDst[]="d:/Vb1/0";//⽬标⽂件路径;
   char strTitle[]="⽂件拷贝"; //⽂件删除进度对话框标题
   SHFILEOPSTRUCT FileOp;//定义SHFILEOPSTRUCT结构对象;
   FileOp.hwnd=this->m_hWnd;
   FileOp.wFunc=FO_DELETE; //执⾏⽂件删除操作;
   FileOp.pFrom=strSrc;
   FileOp.pTo=strDst;
   FileOp.fFlags=FOF_ALLOWUNDO;//此标志使删除⽂件备份到Windows回收站
   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");
  }
fFlags成员标志间的关系
标志抑制的对话框相关性与优先级
FOF_MULTIDESTFILES⽆⽆
FOF_FILESONLY⽆⽆
FOF_SILENT如果设置,进度对话框不显⽰。优先于FOF_SIMPLEPROGRESS标志。
FOF_SIMPLEPROGRESS⽆为FOF_SILENT标志所抑制。
FOF_RENAMEONCOLLISION如果设置了这个标志,当被移动或拷贝的⽂件与
已存在⽂件同名时置换对话框不会出现。名字冲突时,如果FOF_NOCONFIRMATION标志设置,则操作继续。
如果⼆者都设置了,则它优先于
FOF_NOCONFIRMATION。即,⽂件以给定的新名字复制,⽽不是覆盖。
FOF_NOCONFIRMATION如果设置,确认对话框在任何情况下都不出现。名字冲突时,引起⽂件覆盖,除⾮设置了
FOF_NOCONFIRMATION名字冲突时,引起⽂件覆盖,除⾮设置了
FOF_RENAMEONCOLLISION标志。
FOF_NOCONFIRMMKDIR缺省⽬录作为严重错误产⽣⼀个错误消息框。
建⽴⽬录的确认对话框作为错误消息框是否显⽰依赖于
FOF_NOERRORUI的设置。
FOF_NOERRORUI优先于前⼀个标志。如果设置,则,缺省⽬录引起不被处
理的异常,并且返回错误码。
删除⽂件
⽂件删除是⼀个简单的操作,它仅仅影响到输⼊缓冲pFrom,⽽pTo缓冲被忽略。与⽂件复制⼀样,操作的详细情况依赖于标志的设置。相关的标志是:
标志值描述
FOF_SILENT0x0004这个操作不回馈给⽤户,就是说,不显⽰进度对话框。相关的消息框仍然显⽰。
FOF_NOCONFIRMATION0x0010这个标志使函数对任何遇到的消息框都⾃动回答Yes。
FOF_ALLOWUNDO0x0040如果设置,这个标志强迫函数移动被删除的⽂件到‘回收站’中。否则,⽂件将被物理地从磁盘上删除。FOF_FILESONLY0x0080设置这个标志导致函数仅仅删除⽂件,跳过⽬录项。它仅仅应⽤于指定通配符的情况。
FOF_SIMPLEPROGRESS0x0100这导致简化⽤户界⾯。使之只有动画⽽不报告被删除的⽂件名。代之的是显⽰lpszProgressTitle成员中
指定的⽂字。(Win7实际中貌似不可⽤)
FOF_NOERRORUI0x0400如果设置了这个标志,任何发⽣的错误都不能使消息框显⽰,⽽是程序中返回错误码。
这⾥出现的标志最要紧的是FOF_ALLOWUNDO,它决定⽂件是否⼀次就全部删除,或存储到‘回收站’中等候可能的恢复。如果
FOF_ALLOWUNDO被设置,⽂件则被移动到回收站,并且这个操作可以被Undo(尽管可以⼿动Undo)。Undo特征仅在删除下可⽤,在拷贝与移动中没有等价的操作。
SHFileOperation()函数的返回值
MSDN资料中说明,SHFileOperation()在成功时返回0,失败时返回⾮0值。显然这是真的,但并不是最有⽤的解释。重复测试这个函数,可以确信它有⾮常多的终⽌⽅式。事实上,我们经常在系统错误的提⽰中运⾏,在有些地⽅这个函数只是简单地返回从更靠近⽂件系统的其它程序中获得的返回码。下⾯列表给出了SHFileOperation()返回的最通常的部分错误。
描述
错误
2如果你试图重命名多重⽂件,这个消息就会出现。描述是相当直接的:系统不能到指定的⽂件。
7在询问是否想要置换给定⽂件时,你回答了‘取消’,函数就返回这个错误码。它的描述也是相当的不明确—存储控制块被销毁。
115在试图重命名⽂件到不同的⽂件夹时,发⽣这个⽂件系统错。重命名⽂件只是改变⽂件名,⽽不能改变⽂件夹。
117⼀个IOCTL错(输⼊/输出控制),在⽬的路径中有错误时或取消了新⽬录的建⽴时,这个错误发⽣了。
123你正在试图重命名⼀个⽂件,然⽽你给出的名字是⼀个已经存在的⽂件。它也有⼀个⽆⽤的描述:⽂件名,⽬录名,或卷标号的语法是不正确的。
1026在试图移动或拷贝⼀个不存在的⽂件时,出现这个⽂件系统错。⼀般地,它提⽰了,源缓冲中的某些东西应该修改⼀下。这个错误码弹出⼀个的错误框,你可以通过设置FOF_NOERRORUI标志抑制它的显⽰。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。