Windows回收站的文件存取

字號:

一、實現(xiàn)方法
    在Windows的shellapi文件中定義了一個名為SHFileOperation()的外殼函數(shù),用它可以實現(xiàn)各種文件操作,如文件的拷貝、刪除、移動等,該函數(shù)使用起來非常簡單,它只有一個指向SHFILEOPSTRUCT結(jié)構(gòu)的參數(shù)。使用SHFileOperation()函數(shù)時只要填寫該專用結(jié)構(gòu)--SHFILEOPSTRUCT,告訴Windows執(zhí)行什么樣的操作,以及其它重要信息就行了。SHFileOperation()的特別之處在于它是一個高級外殼函數(shù),不同于低級文件處理。當調(diào)用SHFileOperation操作文件時,相應(yīng)的外殼拷貝處理器(如果有的話)被調(diào)用。如在刪除某個文件時,SHFileOperation會將刪除的文件放到Recycle Bin中。SHFileOperation()函數(shù)的原形為:
    WINSHELLAPI int WINAPI SHFileOperation (LPSHFILEOPSTRUCT lpFIleOp);
    函數(shù)中參數(shù)類型為一個LPSHFILEOPSTRUCT結(jié)構(gòu),它包含有進行文件操作的各種信息,其具體的結(jié)構(gòu)如下:
    Typedef struct _ShFILEOPSTRUCT
    {
    HWND hWnd; //消息發(fā)送的窗口句柄;
    UINT wFunc; //操作類型
    LPCSTR pFrom; //源文件及路徑
    LPCSTR pTo; //目標文件及路徑
    FILEOP_FLAGS fFlags; //操作與確認標志
    BOOL fAnyOperationsAborted; //操作選擇位
    LPVOID hNameMappings; //文件映射
    LPCSTR lpszProgressTitle; //文件操作進度窗口標題
    }SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;
    在這個結(jié)構(gòu)中,hWnd是指向發(fā)送消息的窗口句柄,pFrom與pTo是進行文件操作的源文件名和目標文件名,它包含文件的路徑,對應(yīng)單個文件的路徑字符串,或?qū)τ诙鄠€文件,必須以NULL作為字符串的結(jié)尾或文件路徑名之間的間隔,否則在程序運行的時候會發(fā)生錯誤。另外,pFrom和pTo都支持通配符*和?,這大大方便了開發(fā)人員的使用。例如,源文件或目錄有兩個,則應(yīng)是:char pFrom[]="d:\\Test1\0d:\\Text.txt\0",它表示對要D:盤Test目錄下的所有文件和D:盤上的Text.txt文件進行操作。字符串中的"\\"是C語言中的’\’的轉(zhuǎn)義符,’\0’則是NULL。wFunc 是結(jié)構(gòu)中的一個非常重要的成員,它代表著函數(shù)將要進行的操作類型,它的取值為如下:
    ·FO_COPY: 拷貝文件pFrom到pTo 的指定位置。
    ·FO_RENAME: 將pFrom的文件名更名為pTo的文件名。
    ·FO_MOVE: 將pFrom的文件移動到pTo的地方。
    ·FO_DELETE: 刪除pFrom指定的文件。
    使用該函數(shù)進行文件拷貝、移動或刪除時,如果需要的時間很長,則程序會自動在進行的過程中出現(xiàn)一個無模式的對話框(Windows操作系統(tǒng)提供的文件操作對話框),用來顯示執(zhí)行的進度和執(zhí)行的時間,以及正在拷貝、移動或刪除的文件名,此時結(jié)構(gòu)中的成員lpszProgressTitle顯示此對話框的標題。fFlags是在進行文件操作時的過程和狀態(tài)控制標識。它主要有如下一些標識,也可以是其組合:
    ·FOF_FILESONLY:執(zhí)行通配符,只執(zhí)行文件;
    ·FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復(fù)文件;
    ·FOF_NOCONFIRMATION:在出現(xiàn)目標文件已存在的時候,如果不設(shè)置此項,則它會出現(xiàn)確認是否覆蓋的對話框,設(shè)置此項則自動確認,進行覆蓋,不出現(xiàn)對話框。
    ·FOF_NOERRORUI:設(shè)置此項后,當文件處理過程中出現(xiàn)錯誤時,不出現(xiàn)錯誤提示,否則會進行錯誤提示。
    ·FOF_RENAMEONCOLLISION:當已存在文件名時,對其進行更換文提示。
    ·FOF_SILENT:不顯示進度對話框。
    ·FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數(shù)返回正處于操作狀態(tài)的實際文件列表,文件列表名柄保存在hNameMappings成員中。
    ·SHFILEOPSTRUCT結(jié)構(gòu)還包含一個SHNAMEMAPPING結(jié)構(gòu)的數(shù)組,此數(shù)組保存由SHELL計算的每個處于操作狀態(tài)的文件的新舊路徑。
    在使用該函數(shù)刪除文件時必須設(shè)置SHFILEOPSTRUCT結(jié)構(gòu)中的神秘FOF_ALLOWUNDO標志,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶可以撤銷刪除操作。需要注意的是,如果pFrom設(shè)置為某個文件名,用FO_DELETE標志刪除這個文件并不會將它移到Recycle Bin,甚至設(shè)置FOF_ALLOWUNDO標志也不行,在這里你必須使用全路徑名,這樣SHFileOperation才會將刪除的文件移到Recycle Bin。
    二、編程步驟
    1、 啟動Visual C++6.0,生成一個單文檔視圖的項目FileDelete;
    2、為項目添加一個菜單ID_FileDelete,然后用Visual C++的Class Wizard為其在視圖類新增消息處理函數(shù)OnFileDelete();
    3、添加代碼,編譯運行程序;