|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-06-01, 02:04 PM | #1 |
榮譽會員
|
系統 - VC++實現Windows資源回收筒的文件存取
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 (LPSHFILEOPSTRUCT lpFIleOp); 函數中參數類型為一個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都支持通配符*和?,這大大方便了開發人員的使用。例如,源文件或目錄有兩個,則應是:char pFrom[]="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 finished successfully\n"); } 四、小結 在Visual C++編程中實現文件的操作是很多應用程式要涉及到的內容,解決這個問題的一般方法是直接利用CFile 類的操作成員函數,這種方法對於廣大Visual C++編程愛好者來說已經耳熟能詳了,其實使用我們上文介紹的方法,利用Win32外殼來實現拷貝、更名、移動、刪除等各種文件操作將更加高效、快捷,值得一提的是該方法不僅具有上述功能,它還直接支持對一個目錄或目錄樹進行操作。同時該方法直接調用Windows操作系統中的外殼,它的處理過程與Windows的自身文件處理過程是一致的,這大大地有利於我們開發的應用程式與操作系統保持高度的一致性。 |
送花文章: 3,
|