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