(转载于:http://hi.baidu.com/%B4%E7%B2%DD%D0%C4_/blog/item/e3a8200a28f6ea3ab1351d38<wbr>.html</wbr>)
总结一下SHFileOperation的用法,希望对大家有用
//删除文件或者文件夹
bool DeleteFile(char * lpszPath)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_ALLOWUNDO |<wbr><wbr>//允许放回回收站<br><wbr><wbr><wbr><wbr><wbr>FOF_NOCONFIRMATION; //不出现确认对话框<br>FileOp.pFrom = lpszPath;<br>FileOp.pTo = NULL;<wbr><wbr><wbr><wbr><wbr>//一定要是NULL<br>FileOp.wFunc = FO_DELETE;<wbr><wbr><wbr>//删除操作<br>return SHFileOperation(&FileOp) == 0;<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//复制文件或文件夹
bool CopyFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION|<wbr><wbr>//不出现确认对话框<br><wbr><wbr><wbr><wbr><wbr>FOF_NOCONFIRMMKDIR ; //需要时直接创建一个文件夹,不需用户确定<br>FileOp.pFrom = pFrom;<br>FileOp.pTo = pTo;<br>FileOp.wFunc = FO_COPY;<br>return SHFileOperation(&FileOp) == 0;<br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//移动文件或文件夹
bool MoveFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION|<wbr><wbr>//不出现确认对话框<br><wbr><wbr><wbr><wbr><wbr>FOF_NOCONFIRMMKDIR ; //需要时直接创建一个文件夹,不需用户确定<br>FileOp.pFrom = pFrom;<br>FileOp.pTo = pTo;<br>FileOp.wFunc = FO_MOVE;<br>return SHFileOperation(&FileOp) == 0; <wbr><wbr><br>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//从命名文件或文件夹
bool ReNameFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION;<wbr><wbr>//不出现确认对话框<br>FileOp.pFrom = pFrom;<br>FileOp.pTo = pTo;<br>FileOp.wFunc = FO_RENAME;<br>return SHFileOperation(&FileOp) == 0; <wbr><wbr><br>}</wbr></wbr></wbr></wbr>
应用举例:
DeleteFile("d:\\PID\0\0");<wbr><wbr><wbr>//删除一个文件夹<br>DeleteFile("d:\\PID.dsp\0d:\\PID.dsw\0\0"); //删除多个文件<br>CopyFile("d:\0\0","D:\\MyProjects\\临时程序\0\0");<wbr><wbr><wbr>//把"临时程序"文件夹放到d盘下面<br>CopyFile("d:\0\0","D:\\MyProjects\\临时程序<a href="file://pid.dsp/0D://MyProjects//" style="text-decoration: none; color: rgb(101, 91, 59); ">\\PID.dsp\0D:\\MyProjects\\</a>临时程序<a href="file://pid.dsw/0" style="text-decoration: none; color: rgb(101, 91, 59); ">\\PID.dsw\0</a>"); //把PID.dsp和PID.dsw俩个文件放到d盘下面<br>ReNameFile("d:\\NewName","d:\\PID\0\0"); \\把PID文件夹从命名为NewName<br>注意:,如果你想把"D:\\MyProjects\\临时程序\0\0"的文件夹复制到D盘下,并从命名为NewName,应该这样<br>CopyFile("d:\\NewName\0\0","D:\\MyProjects\\临时程序<a href="file:///0/0" style="text-decoration: none; color: rgb(101, 91, 59); ">\\*.*\0\0</a>"); //把"临时程序"文件夹复制到d盘下并从命名为"NewName"<wbr><wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr></wbr>
下面这个类方便你复制多个文件或文件夹,仅作参考
//连接多个路径的类
class JOINFILEPATH
{
private:
int pos;
char* MultipleFilePath;
public:
JOINFILEPATH()
{
<wbr><wbr>pos=0;<br><wbr><wbr>MultipleFilePath=new char[MAX_PATH*10];<br><wbr><wbr>memset(MultipleFilePath,0,MAX_PATH*10);<br>}<br>~JOINFILEPATH() { delete []MultipleFilePath; }<br>void join(char *FilePath)<br>{<br><wbr><wbr>while(*FilePath!='\0')<br><wbr><wbr><wbr>MultipleFilePath[pos++]=*FilePath++;<br><wbr><wbr>pos++;<br>}<br>char * GetMultipleFilePath() {return MultipleFilePath;}<br>};</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//应用举例:
JOINFILEPATH FilePath;
FilePath.join("D:\\MyProjects\\临时程序\\PID\\PID.dsp");
FilePath.join("D:\\MyProjects\\临时程序\\PID\\PID.dsw");
CopyFile("d:\0\0",FilePath.GetMultipleFilePath());
1 pFrom和pTo最好以\0\0结尾(把存放路径的字符串初始化为0),不然有可能会出错,中间的每一个路径用\0隔开
2 pFrom所指向的文件或文件夹(可以多个)会被复制或移动到pTo所指向的文件夹下面(假如文件夹不存在会询问是否创建,当然你也可以选择直接创建)
参数详解:
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:盘Test目录下的所有文件和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计算的每个处于操作状态的文件的新旧路径。
在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle Bin。
转自http://blog.csdn.net/jhb92/archive/2007/04/13/1563452.aspx
Shell的文件操作函数
SHFileOperation
功能:
1.复制一个或多个文件
2.删除一个或多个
3.重命名文件
4.移动一个或多个文件
有一样的Win32API功能函数是:
CopyFile(),DeleteFile(),MoveFile()
MoveFile可以对文件重命名!
Win32 API 的层次比SHFileOperation低
SHFileOperation
的重要参数
1.wFunc //对pFrom pTo要执行的操作
2.fFlags //影响对wFunx的操作
3.hNameMappings<wbr><wbr>//有系统填充,和你也可以填充<br>4.lpszProgressTitle</wbr></wbr>
pFrom pTo 在结尾是两个'\0\0'
通常用一个'\0',这样会失败的!!
当FOF_MULTIDESTFILES
szPFrom[lstrlen(szPFrom)+1]=0
szPFrom:必须先确定他所指定的文件存在!
可以是单个文件名,*.*,或包含统配符的文件名
注意必须是文件名,不是文件所在的文件夹名
szSource:可以是一个目录,如果不是目录,但又有
多个文件,那么必须和szPFrom的每一个文件对应,还要指定
FOF_MULTIDETFILES标志
Source and Target
多个文件---> 一个文件夹
许多单独的文件---->一个文件夹
单独文件--->单独文件
许多单独的文件---->许多单独的文件
单独文件:知道名字的文件
多个文件:带有统配符的文件
注意到source中没有对文件夹的操作!!
!!!!
SHFileOperation能操作网络上的文件
如果你想将本地文件复制到192.168.1.99
那么只要在192.168.1.99上共享123目录
然后将pTo设置为\\192.168.1.99\123
就可以了
但不要设置为\\192.168.1.99
对hNameMappings操作是Undocumented!!
如果没有指定hNameMappings
那么hNameMappings一直是NULL
只有当某种操作(copy,move,rename)引起了文件名冲突了,hNameMappings才不是NULL!!!
当第一次copy某些文件到空目录中时hNameMappings一定是NULL
所以hNameMappings只是内存中的一块地区用来让Explorer.exe保存被重命名的文件,以避免文件名冲突!
上面知道了如何才能使hNameMappings有效
现在如何使用hNameMappings,及其所指的结构大小?并取得这个内存块的内容呢?
hNameMappings 是简单LPVOID无法使用loop
要使用hNameMappings,必须定义一个结构体
struct HANDLETOMAPPINGS {
<wbr><wbr><wbr>UINT<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>uNumberOfMappings; // number of mappings in array<br><wbr><wbr><wbr>LPSHNAMEMAPPING<wbr><wbr>lpSHNameMapping;<wbr><wbr><wbr>// pointer to array of mappings<br>};<br>但是可以写一个Enumerate function to enumerate lpSHNameMapping指向的内存块,并且是让Window自己调用我的,不是我主动调用,象Loop</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
相关联接:
Q154123:File Name Mapping with Windows NT 4.0 Shell
Q133326:SHFILEOPSTRUCT pFrom and pTo Fields Incorrect
Q142066:PRB: SHGetNameMappingPtr() and SHGetNameMappingCount()
Manipulating Files with the SHFileOperation Function in Visual Basic 4.0
<wbr></wbr>
FOF_SILENT //不产生正在复制的对话框
FOF_NOCONFIRMMKDIR//如果目的目录不存在,就默认创建
FOF_NOCONFIRMATION //不出现确认文件替换对话框(Confirmation Dialog)(默认替换原来的文i件)
FOF_NOERRORUI//不出现错误对话框
最好不要同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
因为FOF_NOCONFIRMMKDIR屏蔽了missing directory Error
但FOF_NOERROR又屏蔽了missing directory Error,那么在同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
时也阻止了新目录安静(没有用户确认要产生新目录的对话框)的产生!!
那么如何同时使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
就必须先确认pTo所指定的目录存在即可
BOOL MakeSureDiretoryPathExis<wbr>ts(LPCSTR DirPath);</wbr>
使用它要包含imagehlp.h和imagehlp.lib
如何判断同时存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
=====
因此本人注释:如果出现弹出"无法删除 文件无法:读取源文件或磁盘文.",
可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI
=====
FOF_RENAMEONCOLLISION//有重复文件时自动重命名
能产生对话框的标志:
FOF_SILENT<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//progress dialog<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><br>FOF_RENAMEONCOLLISION //replace dialog<br>FOF_NOCONFIRMATION<wbr><wbr><wbr><wbr>//confirmation dialog<br>FOF_NOCONFIRMMKDIR<wbr><wbr><wbr><wbr>//asks for your permission to create a new folder<br>FOF_NOERRORUI<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>//error message</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
FOF_ALLOWUNDO<wbr><wbr><wbr><wbr>//将文件放入回收站,否则直接删除,一般这个最好做默认</wbr></wbr></wbr></wbr>
<wbr>///////////////////////////////////////////////////</wbr>
百度收索到:
<wbr></wbr>
1 |
SHFILEOPSTRUCT详解
|
|
<wbr><wbr>与所有仅使用数据结构作为输入参数的函数一样,SHFileOperation()函数是一个相当灵活的例程。通过以适当的方式组合各种标志,和使用(或不使用)各个SHFILEOPSTRUCT结构的成员,它可以执行许多操作。下面就让我们来看一看这个结构中每一个成员所起的的作用:<br><br>Hwnd<br><wbr>由这个函数生成的所有对话框的父窗口Handle。<br><wbr><br>wFunc<br><wbr>表示要执行的操作<br><wbr><br>pFrom<br><wbr>含有源文件名的缓冲<br><wbr><br>pTo<br><wbr>含有目标文件名的缓冲(不考虑删除的情况)<br><wbr><br>fFlags<br><wbr>能够影响操作的标志<br><wbr><br>fAnyOperationsAborted<br><wbr>包含TRUE或FALSE的返回值。它依赖于是否在操作完成之前用户取消了操作。通过检测这个成员,你就可以确定操作是正常完成了还是被手动中断了。<br><wbr><br>hNameMappings<br><wbr>资料描述它为包含SHNAMEMAPPING结构数组的文件名映射对象的Handle。<br><wbr><br>lpszProgressTitle<br><wbr>一个在一定情况下用于显示对话框标题的字符串。<br><wbr><br><br><wbr>抑制的对话框<br><wbr>相关性与优先级<br><wbr><br>FOF_MULTIDESTFILES<br><wbr>None<br><wbr>None<br><wbr><br>FOF_FILESONLY<br><wbr>None<br><wbr>None<br><wbr><br>FOF_SILENT<wbr><br><wbr>如果设置,进度对话框不显示。<br><wbr>优先于FOF_SIMPLEPROGRESS标志。<br><wbr><br>FOF_SIMPLEPROGRESS<br><wbr>None<br><wbr>为FOF_SILENT标志所抑制。<br><wbr><br>FOF_RENAMEONCOLLISION<br><wbr>如果设置了这个标志,当被移动或拷贝的文件与已存在文件同名时置换对话框不会出现。<br><wbr>名字冲突时,如果FOF_NOCONFIRMATION标志设置,则操作继续。<br><br>如果二者都设置了,则它优先于FOF_NOCONFIRMATION。即,文件以给定的新名字复制,而不是覆盖。<br><wbr><br>FOF_NOCONFIRMATION<br><wbr>如果设置,确认对话框在任何情况下都不出现。<br><wbr>名字冲突时,引起文件覆盖,除非设置了FOF_RENAMEONCOLLISION标志。<br><wbr><br><br>FOF_NOCONFIRMMKDIR<wbr><br><wbr>抑制请求建立新文件夹的对话框<br><wbr>缺省目录作为严重错误产生一个错误消息框。<br><br>建立目录的确认对话框作为错误消息框是否显示依赖于FOF_NOERRORUI的设置。<br><wbr><br>FOF_NOERRORUI<wbr><br><wbr>抑制所有错误消息框。<br><wbr>优先于前一个标志。如果设置,则,缺省目录引起不被处理的异常,并且返回错误码。<br><wbr><br><br>FOF_SILENT<br><wbr><br>0x0004<br><wbr>这个操作不回馈给用户,就是说,不显示进度对话框。相关的消息框仍然显示。<br><wbr><br>FOF_NOCONFIRMATION<br><wbr><br>0x0010<br><wbr>这个标志使函数对任何遇到的消息框都自动回答Yes。<br><wbr><br>FOF_ALLOWUNDO<br><br><wbr>0x0040<br><wbr>如果设置,这个标志强迫函数移动被删除的文件到‘回收站’中。否则,文件将被物理地从磁盘上删除。<br><wbr><br>FOF_FILESONLY<br><wbr><br>0x0080<br><wbr>设置这个标志导致函数仅仅删除文件,跳过目录项。它仅仅应用于指定通配符的情况。<br><wbr><br>FOF_SIMPLEPROGRESS<br><wbr><br>0x0100<br><wbr>这导致简化用户界面。使之只有动画而不报告被删除的文件名。代之的是显示lpszProgressTitle成员中指定的文字。<br><wbr><br>FOF_NOERRORUI<br><wbr><br>0x0400<wbr><br><wbr>如果设置了这个标志,任何发生的错误都不能使消息框显示,而是程序中返回错误码。<wbr><br><wbr><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
FOF_SIMPLEPROGRESS或FOF_SILENT隐藏正在被删除的文件名,
通过设置 FOF_FILESONLY,仅仅删除文件。 // FOF_ALLOWUNDO,它允许程序员决定文件是否一次就全部删除,或存储到‘回收站
’中等候可能的恢复。如果FOF_ALLOWUNDO被设置,文件则被移动到回收站,并且
这个操作可以被Undo(尽管可以手动Undo)。
|
|
|
相关推荐
VC 移动,复制,删除文件(SHFileOperation) 技术汇总
在工作中遇到的问题,结合网上的各方资料现整理出此脚本! 此脚本在PB环境中已经测试通过,请放心使用,如有疑问请密我!
使用API函数SHFileOperation,这个函数可以同时拷贝、删除、改名或移动多个文件,甚至整个目录。如果你愿意,还可以显示相应的动画对话框,功能十分强大。SHFileOperation的参数是一个SHFILEOPSSTRUCT结构。这个结构...
VB利用SHFileOperation调用系统对话框实现对文件拷贝、删除、重命名
调用 SHFileOperation 函数实现复制文件或删除到回收站(6KB)
用VC编写的文件夹复制代码。 建一个支持MFC的控制台。 在using namespace std;下面加一句 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) //这句控制不显示界面 然后在main函数...
源码 复制和删除整个文件夹的例子,分别采用了通过WinBase.h中的基本操作函数和ShlwApi.h中的SHFileOperation来实现文件夹的复制和删除操作。 工程中包含VC6.0和VS2010两个版本。
windows系统自身提供了一套拷贝、移动、删除和重命名文件的windows shell函数,而不需要调用系统的CopyFile等api函数。 提供了两种函数接口,分别是vista版本前的SHFileOperation和之后版本的IFileOperation接口 ...
1.VC 文件 操作 复制 拷贝 代码 源码 范例 示例 SHFileOperation 2.解决使用SHFileOperation时,无法读源文件或磁盘 错误问题。 3.只有复制操作示例,其它删除、移动没有。
调用api函数SHFileOperation 实现将指定目录的文件夹复制到系统临时目录。 测过了,长短文件,都没问题
SHFileOperation文件操作
vc 利用API函数SHFileOperation实现文件夹的强行复制。里面有详细说明。
复制文件夹及里面的文件。 使用SHFileOperation函数进行操作, 会弹出系统进度条,用户交互较友好。
这是一付后悔药,不慎把回收站里的文件清空了,还可以找回来。
删除文件夹及里面的文件。 使用SHFileOperation函数进行操作, 会弹出系统进度条,用户交互较友好。
我的其他资源都是免费的,对于初学游戏者的帮助比较大的,其中有单片机,ARM,数据结构,window编程,MFC编程,cocos2dx,unity3d自己编写的小游戏。...博客里详细的说明了项目的编写过程,和游戏开发实用技术。...
易语言通过回收站删除文件源码,通过回收站删除文件,SHFileOperation,SHEmptyRecycleBin
易语言文件复制到剪贴板源码,文件复制到剪贴板,复制到剪贴板,从剪贴板粘贴,SHFileOperation,EmptyClipboard,OpenClipboard,CloseClipboard,SetClipboardData,GetClipboardData,IsClipboardFormatAvailable,...
Delphi 复制文件夹到其他路径中,比较传统的复制,只是演示某些基础的Delphi文件操作函数的使用,比如: wnd:=handle; wfunc:=fo_copy; pfrom:=@frombuf; pto:=@tobuf; fflags:=fof_noconfirmation or fof...
C#删除文件到回收站DEMO源码 原理:调用shell32.dll内函数 SHFileOperation删除文件到回收站。实测通过。删除文件代码已封装为一个类,DEMO为控制台程序,可方便地将代码移植到您的项目中。