Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8158501
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-03-17 14:14:07

下载本文示例代码
问题:
    我想用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完成了最烦人的事情。它使得回收操作的编程易如反掌。看看代码吧!



下载本文示例代码
阅读(1422) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~