2023年7月6日发(作者:)
VC++实现Windows回收站的⽂件存取
VC++实现Windows回收站的⽂件存取 在进⾏⽂件操作时,可以使⽤CFile类中的Remove()函数来删除⼀个⽂件,但是这样的操作将永久性的删除该⽂件,不能在必要的时候再恢复该⽂件,解决这个问题的唯⼀⽅法就是把⽂件送到Windows系统中的回收站(Recycle Bin)⾥⾯,⽽不是简单的永久性删除它,这样⽤户就可以在必要的时候恢复这个⽂件。这个例⼦就来说明如何实现编程来实现Windows回收站的⽂件存取操作。
⼀、实现⽅法 在Windows的shellapi⽂件中定义了⼀个名为SHFileOperation()的外壳函数,⽤它可以实现各种⽂件操作,如⽂件的拷贝、删除、移动等,该函数使⽤起来⾮常简单,它只有⼀个指向SHFILEOPSTRUCT结构的参数。使⽤SHFileOperation()函数时只要填写该专⽤结构--SHFILEOPSTRUCT,告诉Windows执⾏什么样的操作,以及其它重要信息就⾏了。SHFileOperation()的特别之处在于它是⼀个⾼级外壳函数,不同于低级⽂件处理。当调⽤SHFileOperation操作⽂件时,相应的外壳拷贝处理器(如果有的话)被调⽤。如在删除某个⽂件时,SHFileOperation会将删除的⽂件放到Recycle Bin中。SHFileOperation()函数的原形为:WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCTlpFIleOp); 函数中参数类型为⼀个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都⽀持通配符*和?,这⼤⼤⽅便了开发⼈员的使⽤。例如,源⽂件或⽬录有两个,则应是:charpFrom[]="d:Test10d:0",它表⽰对要D:盘Test⽬录下的所有⽂件和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成员中。
·SHFILEOPSTRUCT结构还包含⼀个SHNAMEMAPPING结构的数组,此数组保存由SHELL计算的每个处于操作状态的⽂件的新旧路径。
在使⽤该函数删除⽂件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的⽂件拷到Recycle Bin,从⽽使⽤户可以撤销删除操作。需要注意的是,如果pFrom设置为某个⽂件名,⽤FO_DELETE标志删除这个⽂件并不会将它移到Recycle Bin,甚⾄设置FOF_ALLOWUNDO标志也不⾏,在这⾥你必须使⽤全路径名,这样SHFileOperation才会将删除的⽂件移到Recycle Bin。
⼆、编程步骤1、启动Visual C++6.0,⽣成⼀个单⽂档视图的项⽬FileDelete;
2、为项⽬添加⼀个菜单ID_FileDelete,然后⽤Visual C++的Class Wizard为其在视图类新增消息处理函数OnFileDelete();
3、添加代码,编译运⾏程序;三、程序代码///void CFileOperationView::OnFileDelete()
{
int nOk;
char strSrc[]="d:Vb0";//源⽂件路径;
char strDst[]="d:Vb10";//⽬标⽂件路径;
char strTitle[]="⽂件拷贝"; //⽂件删除进度对话框标题
SHFILEOPSTRUCT FileOp;//定义SHFILEOPSTRUCT结构对象;
=this-> m_hWnd;
=FO_DELETE; //执⾏⽂件删除操作;
=strSrc;
=strDst;
=FOF_ALLOWUNDO;//此标志使删除⽂件备份到Windows回收站
appings=NULL;
ogressTitle=strTitle;
//开始删除⽂件
nOk=SHFileOperation(&FileOp);
if(nOk)
TRACE("There is an error: %dn",nOk);
else
TRACE("SHFileOperation finishedsuccessfullyn");
}四、⼩结 在Visual C++编程中实现⽂件的操作是很多应⽤程序要涉及到的内容,解决这个问题的⼀般⽅法是直接利⽤CFile 类的操作成员函数,这种⽅法对于⼴⼤Visual C++编程爱好者来说已经⽿熟能详了,其实使⽤我们上⽂介绍的⽅法,利⽤Win32外壳来实现拷贝、更名、移动、删除等各种⽂件操作将更加⾼效、快捷,值得⼀提的是该⽅法不仅具有上述功能,它还直接⽀持对⼀个⽬录或⽬录树进⾏操作。同时该⽅法直接调⽤Windows操作系统中的外壳,它的处理过程与Windows的⾃⾝⽂件处理过程是⼀致的,这⼤⼤地有利于我们开发的应⽤程序与操作系统保持⾼度的⼀致性。
发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1688598735a153684.html
评论列表(0条)