程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> Windows中回收站(Recycle Bin)的存取方法

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

編輯:關於VC++

本文配套源碼

問題:

我想用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完成了最煩人的事情。它使得回收操作的編程易如反掌。看看代碼吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved