关于 SHFILEOPSTRUCT

来源:互联网 发布:微博抽奖软件 编辑:程序博客网 时间:2024/06/06 17:38

csdn上有讨论:http://bbs.csdn.net/topics/60058187

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

  WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp); 

  函数中参数类型为一个LPSHFILEOPSTRUCT结构,它包含有进行文件操作的各种信息,其具体的结构如下:   

  Typedef struct _ShFILEOPSTRUCT 

  { 

   HWND hWnd; //消息发送的窗口句柄; 

   UINT wFunc; //操作类型 

   LPCSTR pFrom; //源文件及路径 

   LPCSTR pTo; //目标文件及路径 

   FILEOP_FLAGS fFlags; //操作与确认标志 

   BOOL fAnyOperationsAborted; //操作选择位 

   LPVOID hNameMappings; //文件映射 

   LPCSTR lpszProgressTitle; //文件操作进度窗口标题 

  }SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;    

  在这个结构中,hWnd是指向发送消息的窗口句柄,pFrom与pTo是进行文件操作的源文件名和目标文件名,它包含文件的路径,对应单个文件的路径字符串,或对于多个文件,必须以NULL作为字符串的结尾或文件路径名之间的间隔,否则在程序运行的时候会发生错误。另外,pFrom和pTo都支持通配符*和?,这大大方便了开发人员的使用。例如,源文件或目录有两个,则应是:char pFrom[]="d:/Test1/0d:/Text.txt/0",它表示对要D:盘Test1目录下的所有文件和D:盘上的Text.txt文件进行操作。字符串中的""是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成员中。 

  ·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"); 

  } 

——————————————————————————————————————————————————————

SHFILEOPSTRUCT详解

  与所有仅使用数据结构作为输入参数的函数一样,SHFileOperation()函数是一个相当灵活的例程。通过以适当的方式组合各种标志,和使用 (或不使用)各个SHFILEOPSTRUCT结构的成员,它可以执行许多操作。下面就让我们来看一看这个结构中每一个成员所起的的作用: 

Hwnd 
由这个函数生成的所有对话框的父窗口Handle。 

wFunc 
表示要执行的操作 

pFrom 
含有源文件名的缓冲 

pTo 
含有目标文件名的缓冲(不考虑删除的情况) 

fFlags 
能够影响操作的标志 

fAnyOperationsAborted 
包含TRUE或FALSE的返回值。它依赖于是否在操作完成之前用户取消了操作。通过检测这个成员,你就可以确定操作是正常完成了还是被手动中断了。 

hNameMappings 
资料描述它为包含SHNAMEMAPPING结构数组的文件名映射对象的Handle。 

lpszProgressTitle 
一个在一定情况下用于显示对话框标题的字符串。 


抑制的对话框 
相关性与优先级 

FOF_MULTIDESTFILES 
None 
None 

FOF_FILESONLY 
None 
None 

FOF_SILENT  
如果设置,进度对话框不显示。 
优先于FOF_SIMPLEPROGRESS标志。 

FOF_SIMPLEPROGRESS 
None 
为FOF_SILENT标志所抑制。 

FOF_RENAMEONCOLLISION 
如果设置了这个标志,当被移动或拷贝的文件与已存在文件同名时置换对话框不会出现。 
名字冲突时,如果FOF_NOCONFIRMATION标志设置,则操作继续。 

如果二者都设置了,则它优先于FOF_NOCONFIRMATION。即,文件以给定的新名字复制,而不是覆盖。 

FOF_NOCONFIRMATION 
如果设置,确认对话框在任何情况下都不出现。 
名字冲突时,引起文件覆盖,除非设置了FOF_RENAMEONCOLLISION标志。 


FOF_NOCONFIRMMKDIR  
抑制请求建立新文件夹的对话框 
缺省目录作为严重错误产生一个错误消息框。 

建立目录的确认对话框作为错误消息框是否显示依赖于FOF_NOERRORUI的设置。 

FOF_NOERRORUI  
抑制所有错误消息框。 
优先于前一个标志。如果设置,则,缺省目录引起不被处理的异常,并且返回错误码。 


FOF_SILENT 

0x0004 
这个操作不回馈给用户,就是说,不显示进度对话框。相关的消息框仍然显示。 

FOF_NOCONFIRMATION 

0x0010 
这个标志使函数对任何遇到的消息框都自动回答Yes。 

FOF_ALLOWUNDO 

0x0040 
如果设置,这个标志强迫函数移动被删除的文件到‘回收站’中。否则,文件将被物理地从磁盘上删除。 

FOF_FILESONLY 

0x0080 
设置这个标志导致函数仅仅删除文件,跳过目录项。它仅仅应用于指定通配符的情况。 

FOF_SIMPLEPROGRESS 

0x0100 
这导致简化用户界面。使之只有动画而不报告被删除的文件名。代之的是显示lpszProgressTitle成员中指定的文字。 

FOF_NOERRORUI 

0x0400 
如果设置了这个标志,任何发生的错误都不能使消息框显示,而是程序中返回错误码。


下面是E文原文:

Contains information that the SHFileOperation function uses to perform file operations.

typedef struct _SHFILEOPSTRUCT { // shfos  
HWND         hwnd; 
UINT         wFunc; 
LPCSTR       pFrom; 
LPCSTR       pTo; 
FILEOP_FLAGS fFlags; 
BOOL         fAnyOperationsAborted; 
LPVOID       hNameMappings; 
LPCSTR       lpszProgressTitle; 
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT; 


Members

hwnd

Handle of the dialog box to use to display information about the status of the operation. 

wFunc

Operation to perform. This member can be one of the following values:

FO_COPY    Copies the files specified by pFrom to the location specified by pTo.
FO_DELETE    Deletes the files specified by pFrom (pTo is ignored).
FO_MOVE    Moves the files specified by pFrom to the location specified by pTo.
FO_RENAME    Renames the files specified by pFrom. 


pFrom

Pointer to a buffer that specifies one or more source file names. Multiple names must be null-separated. The list of names must be double null-terminated.

pTo

Pointer to a buffer that contains the name of the destination file or directory. The buffer can contain mutiple destination file names if the fFlags member specifies FOF_MULTIDESTFILES. Multiple names must be null-separated. The list of names must be double null-terminated.

fFlags

Flags that control the file operation. This member can be a combination of the following values:

FOF_ALLOWUNDO    Preserves undo information, if possible.
FOF_CONFIRMMOUSE    Not implemented.
FOF_FILESONLY    Performs the operation only on files if a wildcard filename (*.*) is specified.
FOF_MULTIDESTFILES    Indicates that the pTo member specifies multiple destination files (one for each source file) rather than one directory where all source files are to be deposited.
FOF_NOCONFIRMATION    Responds with "yes to all" for any dialog box that is displayed.
FOF_NOCONFIRMMKDIR    Does not confirm the creation of a new directory if the operation requires one to be created.
FOF_RENAMEONCOLLISION    Gives the file being operated on a new name (such as "Copy #1 of...") in a move, copy, or rename operation if a file of the target name already exists.
FOF_SILENT    Does not display a progress dialog box.
FOF_SIMPLEPROGRESS    Displays a progress dialog box, but does not show the filenames.
FOF_WANTMAPPINGHANDLE    Fills in the hNameMappings member. The handle must be freed by using the SHFreeNameMappings function.


fAnyOperationsAborted

Value that receives TRUE if the user aborted any file operations before they were completed or FALSE otherwise.

hNameMappings

Handle of a filename mapping object that contains an array of SHNAMEMAPPING structures. Each structure contains the old and new path names for each file that was moved, copied, or renamed. This member is used only if fFlags includes FOF_WANTMAPPINGHANDLE.

lpszProgressTitle

Pointer to a string to use as the title for a progress dialog box. This member is used only if fFlags includes FOF_SIMPLEPROGRESS.



Remarks

If pFrom or pTo are unqualified names, the current directories are taken from the global current drive and directory settings as managed by the GetCurrentDirectory and SetCurrentDirectory functions.

原创粉丝点击