Windows中回收站(Recycle Bin)的存取方法

问题:
我想用CFile::Remove(或其它可行的方法)删除一个文件,但是只是想将它送到Recycle Bin里面,而不是永久性地删除它,这样我的用户就可以在必要的时候能恢复这个文件。我不通过编程能不能实现?如果必须编程,那如何在程序中存取Recycle Bin?
解答:
这个问题的答案是:外壳API函数——SHFileOperation,它定义在shellapi.文件中。为了使用
SHFileOperation,必须填写专用结构——SHFILEOPSTRUCT——告诉Windows执行什么样的操作,删除哪个文件,以及其它重要信息。SHFileOperation的公共能包括拷贝、删除、移动以及单文件或多文件改名。SHFileOperation的特别之处在于它是一个高级外壳函数,不用于低级文件处理。当你用SHFileOperation拷贝文件时,相应的外壳拷贝处理器(如果有的话)被调用。在有关的文档中是这样说的:“当用于删除某个文件时,SHFileOperation会将删除的文件放到Recycle Bin。”
当然,如果你是第一次试,可能不成功。那是因为文档没有告诉你还必须设置神秘的FOF_ALLOWUNDO标志。将文件拷到Recycle Bin,从而使用户可以撤销删除操作,回想起来这个功能确实很棒。但是当你第一次试验时,如果走马观花似的看文档用处不大。要看就得仔细看。
文档中与本文有关的段落是文件的相对路径名,文档中是这样说的:“如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行。你必须使用全路径名”, 心细的读者从中可以推断出:如果设置FOF_ALLOWUNDO标志并且路径名是全路径名,SHFileOperation才会将删除的文件移到Recycle Bin。实际上,要回收一个文件,必须使用全路径名和FOF_ALLOWUNDO标志,为了具体说明实现细节,我写了一个小类叫做CRecycleFile,以及一个使用这个小类的控制台程序RECYCLE。我觉得自己写的这个程序很酷!因为它可以从MS-DOS命令行回收文件。如图五。如果你使用4DOS(FOR DOS) 或 4NT(FOR NT)之类的命令外壳,为“DEL”命令取个别名为——“回收”命令,从而将DOS的删除命令变成回收命令。岂不是很好吗?
图五 运行中的RECYCLE程序
我设计CRecycleFile的目的是方便向我这样的傻瓜程序员使用回收站。
LPCTSTR pszPathName = GetFileNameSomehow(); // 全路径名!
CRecycleFile rf;
rf.Recycle(pszPathName);
有什么比这样做更容易呢?CRecycleFile从SHFILEOPSTRUCT派生而来,所以你可以充分利用其参数。对于一般的回收,因为构造函数已经对SHFILEOPSTRUCT做了初始化,所以不用在参数上做文章。CRecycleFile::Recycle执行关键任务——即发送文件到回收站。最难的部分(一旦你学会了不可思议的FOF_ALLOWUNDO标志)是将调用者串拷贝到某个缓冲,要将另一个空结尾(NULL)添加到串尾。SHFileOperation使你能一次删除许多文件,但是你必须将文件名一个一个连接起来,最后用空结尾(两个NULLs)结束。所幸的是,CRecycleFile完成了最烦人的事情。它使得回收操作的编程易如反掌。看看代码吧!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值