VC++實現Windows資源回收筒的檔案存取

來源:互聯網
上載者:User

 

VC++實現Windows資源回收筒的檔案存取

  在進行檔案操作時,可以使用CFile類中的Remove()函數來刪除一個檔案,但是這樣的操作將永久性的刪除該檔案,不能在必要的時候再恢複該檔案,解決這個問題的唯一方法就是把檔案送到Windows系統中的資源回收筒(Recycle
Bin)裡面,而不是簡單的永久性刪除它,這樣使用者就可以在必要的時候恢複這個檔案。這個例子就來說明如何?編程來實現Windows資源回收筒的檔案存取操作。

一、實現方法
  在Windows的shellapi檔案中定義了一個名為SHFileOperation()的外殼函數,用它可以實現各種檔案操作,如檔案的拷貝、刪除、移動等,該函數使用起來非常簡單,它只有一個指向SHFILEOPSTRUCT結構的參數。使用SHFileOperation()函數時只要填寫該專用結構--SHFILEOPSTRUCT,告訴Windows執行什麼樣的操作,以及其它重要訊息就行了。SHFileOperation()的特別之處在於它是一個進階外殼函數,不同於低級檔案處理。當調用SHFileOperation操作檔案時,相應的外殼拷貝處理器(如果有的話)被調用。如在刪除某個檔案時,SHFileOperation會將刪除的檔案放到Recycle
Bin中。SHFileOperation()函數的原形為:

WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCTlpFIleOp);

  函數中參數類型為一個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都支援萬用字元*和?,這大大方便了開發人員的使用。例如,源檔案或目錄有兩個,則應是:charpFrom[]="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。

二、編程步驟

1、啟動Visual C++6.0,產生一個單文檔視圖的項目FileDelete;

2、為項目添加一個菜單ID_FileDelete,然後用Visual C++的Class
Wizard為其在視圖類新增訊息處理函數OnFileDelete();

3、添加代碼,編譯運行程式;

三、程式碼

///////////////////////////////////////////////////////////////////////
void CFileOperationView::OnFileDelete()
{
int nOk;
char strSrc[]="d:\\Vb\0";//源檔案路徑;

char strDst[]="d:\\Vb1\0";//目標檔案路徑;

char strTitle[]="檔案拷貝"; //檔案刪除進度對話方塊標題

SHFILEOPSTRUCT FileOp;//定義SHFILEOPSTRUCT結構對象;

FileOp.hwnd=this-> m_hWnd;
FileOp.wFunc=FO_DELETE; //執行檔案刪除操作;

FileOp.pFrom=strSrc;
FileOp.pTo=strDst;
FileOp.fFlags=FOF_ALLOWUNDO;//此標誌使刪除檔案備份到Windows資源回收筒

FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle;
//開始刪除檔案

nOk=SHFileOperation(&FileOp);
if(nOk)
TRACE("There is an error: %d\n",nOk);
else
TRACE("SHFileOperation finishedsuccessfully\n");

}

四、小結

  在Visual C++編程中實現檔案的操作是很多應用程式要涉及到的內容,解決這個問題的一般方法是直接利用CFile
類的操作成員函數,這種方法對於廣大Visual C++編程愛好者來說已經耳熟能詳了,其實使用我們上文介紹的方法,利用Win32外殼來實現拷貝、更名、移動、刪除等各種檔案操作將更加高效、快捷,值得一提的是該方法不僅具有上述功能,它還直接支援對一個目錄或分類樹進行操作。同時該方法直接調用Windows作業系統中的外殼,它的處理過程與Windows的自身檔案處理過程是一致的,這大大地有利於我們開發的應用程式與作業系統保持高度的一致性。

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.