分类: 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完成了最烦人的事情。它使得回收操作的编程易如反掌。看看代码吧! |