VC++实现回收站的文件存取

在进行文件操作时,可以使用CFile类中的Remove()函数来删除一个文件,但是这样的操作将永久性的删除该文件,不能在必要的时候再恢复该文件,解决这个问题的唯一方法就是把文件送到Windows系统中的回收站(Recycle Bin)里面,而不是简单的永久性删除它,这样用户就可以在必要的时候恢复这个文件。这个例子就来说明如何实现编程来实现Windows回收站的文件存取操作。

一、实现方法

在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:盘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.

时间: 2024-09-19 09:47:20

VC++实现回收站的文件存取的相关文章

关于 SHFILEOPSTRUCT

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

Vc++ 控件List Control用法总结_C 语言

1.新建对话框MFC,在对话框上放一个ListCtrl ID:IDC_PATH View:Report 2.为ListCtrl添加变量 右击->添加变量m_wndPath 3.找到OnInitDialog()函数添加如下代码: // TODO: 在此添加额外的初始化代码 m_wndPath.DeleteAllItems();//清空 m_wndPath.InsertColumn(0,_T("项目"));//添加列 m_wndPath.InsertColumn(1,_T("

Win7系统回收站打不开的应对措施

  1.打开计算机,然后单击工具菜单,弹出子菜单之后直接单击文件夹选项. 2.文件夹选项弹出来之后,在窗口里面的文件夹栏目和隐藏文件之间直接选中隐藏的文件.文件夹以及驱动器 3.重回到计算机,把本地磁盘C打开,就能够看到隐藏的"$Recycle.Bin"文件夹,直接点击进入. 4.文件夹打开之后,会发现在里面有另个回收站的图标,直接将其点击打开. 5.这个回收站里面中存储的也就是桌面回收站里面的文件.

代码-vc 6.0 error c2491 报错啊,头大

问题描述 vc 6.0 error c2491 报错啊,头大 简单又奇怪的问题又来了... debug版完全正常:release版报错c2491. definition of dllimport function not allowed. (我是接手的别人的项目,项目工程代码里没有看到有dllimport 或者是其他明显的问题啊). 解决方案 检查一下你Release版本跟Debug版本的工程配置,尤其预编译宏的设置. 应该有宏定义不一致,导致dllexport,dllimport的导入 解决方

环境-vc++6.0内关于s=(i++)*(i++)的问题

问题描述 vc++6.0内关于s=(i++)*(i++)的问题 int i = 0: s = (i++)*(i++) printf("%d",s): 这个结果应该是多少?我个人分析应该是2,第一个i++使用的是1 然后i的值应该变成2然后第二个i使用的是2 然后i变成3 结果s的值应该是2 但是在vc++6.0的环境下运行结果为什么是1呢?新手求解. 解决方案 这个问题问了无数遍,我想这么告诉你. 就C++语言来说,这个是语言未定义行为,所谓语言未定义行为,就是在语言规范中没有规定遇到

VC++动态链接库(DLL)编程之库的调试与查看

  在具体进入各类DLL的详细阐述之前,有必要对库文件的调试与查看方法进行一下介绍,因为从下一节开始我们将面对大量的例子工程. 由于库文件不能单独执行,因而在按下F5(开始debug模式执行)或CTRL+F5(运行)执行时,其弹出如图3所示的对话框,要求用户输入可执行文件的路径来启动库函数的执行.这个时候我们输入要调用该库的EXE文件的路径就可以对库进行调试了,其调试技巧与一般应用工程的调试一样. 通常有比上述做法更好的调试途径,那就是将库工程和应用工程(调用库的工程)放置在同一VC工作区,只对

电脑回收站中ai文件删不掉该怎么办?

  电脑回收站中ai文件删不掉该怎么办? 某天发现扔到回收站里的.ai文件删不掉又还原不了,清空回收站无限读条,网上搜到的方法什么unlocker什么360什么改                         回收站设置等等一个有用的都没有,后来自己摸索出了解决方法,步骤其实很简单. 1.下载小工具 Q-dir,不大,才几百KB,单文件免安装. 2.打开 Q-dir,进入回收站,右键要删的文件,复制路径 3.windows徽标键+R 打开运行窗口,输入 cmd ,回车 4.在CMD中输入del

电脑回收站中ai文件删不掉如何解决?

  电脑回收站中ai文件删不掉该怎么办?在清理电脑回收站的时候,发现很多.ai文件都删不掉,粉碎也不行,这是怎么回事?下面我们来看看ai文件在回收站删不掉的解决办法,具体内容如下 一些做平面设计的用户可能会在网上下载一些ai文件到电脑系统中,不过在将这类文件删除,移动到回收站后,发现无法清空回收站,因为回收站中的这些ai文件删除不了.如果遇到这样的问题,我们应该如何解决呢?大家可以参考下面的方法成功解决这一问题. 1.从网上下载工具:Q-dir到电脑中,Q-dir是一款多功能资源管理器; 2.打

请问VC++ 怎样处理DPI才能使界面不发虚?

问题描述 请问VC++ 怎样处理DPI才能使界面不发虚? VisualStudio 2015 界面引擎 Sciter 生成的程序界面发虚,怎样处理? 左侧的模糊 右侧的为添加dpi-aware.manifest后的效果 解决方案 贴出图看下是怎么个虚?应该和dpi无关,而是和你绘制字体的反锯齿选项有关.