在Windows的shellapi文件中定義了一個名爲SHFileOperation()的外殼函數,它能夠用來實現各類文件操做,例如文件的拷貝、刪除和移動等,該函數使用起來很是簡單,它只有一個指向SHFILEOPSTRUCT結構的參數。使用SHFileOperation()函數時只要填寫該專用結構--SHFILEOPSTRUCT,告訴Windows執行什麼樣的操做,以及其它重要信息就好了。SHFileOperation()的特別之處在於它是一個高級外殼函數,不一樣於低級文件處理。當調用SHFileOperation操做文件時,相應的外殼拷貝處理器(若是有的話)被調用。如在刪除某個文件時,SHFileOperation會將刪除的文件放到Recycle Bin中。shell
SHFileOperation()函數原型爲:WINSHELLAPI int WINAPI SHFileOperation(LPSHFILESTRUCT lpFileOp);編程
LPSHFILESTRUCT結構格式以下:api
Typedef struct _shFILEOPSTRUCT數組
{app
HWND hWnd; //消息發送的窗口句柄;函數
UINT wFunc; //操做類型測試
LPCSTR pFrom; //源文件以及路徑動畫
LPCSTR pTo; //目標文件以及路徑this
FILEOP_FLAGS fFlags; //操做選擇位spa
LPVOID hNameMapping; //文件映射
LPCSTR lpszProgressTitle; //文件操做進度窗口標題
}SHFILEOPSTRUCT,FAR* LPSHFILEOPSTRUCT;
在這個結構中,hWnd是指向發送消息的窗口句柄,pFrom與pTo是進行文件操做的源文件名和目標文件名,它包含文件的路徑,對應單個文件的路徑字符串,或對於多個文件,必須以NULL做爲字符串的結尾或文件路徑名之間的間隔,不然在程序運行的時候會發生錯誤。另外,pFrom和pTo都支持通配符*和?,這大大方便了開發人員的使用。例如,源文件或目錄有兩個,則應是:char pFrom[]="d:/Test1/0d:/Text.txt/0",它表示對要D:盤Test1目錄下的全部文件和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計算的每一個處於操做狀態的文件的新舊路徑。
同時也有一個重要的應用就是:
在進行文件操做時,能夠使用CFile類中的Remove()函數來刪除一個文件,可是這樣的操做將永久性的刪除該文件,不能在必要的時候再恢復該文件,解決這個問題的惟一方法就是把文件送到Windows系統中的回收站(Recycle Bin)裏面,而不是簡單的永久性刪除它,這樣用戶就能夠在必要的時候恢復這個文件。用這個函數實現編程來實現Windows回收站的文件存取操做。
在使用該函數刪除文件時必須設置SHFILEOPSTRUCT結構中的神祕FOF_ALLOWUNDO標誌,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶能夠撤銷刪除操做。須要注意的是,若是pFrom設置爲某個文件名,用FO_DELETE標誌刪除這個文件並不會將它移到Recycle Bin,甚至設置FOF_ALLOWUNDO標誌也不行,在這裏你必須使用全路徑名,這樣SHFileOperation纔會將刪除的文件移到Recycle Bin。
代碼以下:
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");
}
標誌 |
抑制的對話框 |
相關性與優先級 |
FOF_MULTIDESTFILES |
無 |
無 |
FOF_FILESONLY |
無 |
無 |
FOF_SILENT |
若是設置,進度對話框不顯示。 |
優先於FOF_SIMPLEPROGRESS標誌。 |
FOF_SIMPLEPROGRESS |
無 |
爲FOF_SILENT標誌所抑制。 |
FOF_RENAMEONCOLLISION |
若是設置了這個標誌,當被移動或拷貝的文件與已存在文件同名時置換對話框不會出現。 |
名字衝突時,若是FOF_NOCONFIRMATION標誌設置,則操做繼續。 若是兩者都設置了,則它優先於FOF_NOCONFIRMATION。即,文件以給定的新名字複製,而不是覆蓋。 |
FOF_NOCONFIRMATION |
若是設置,確認對話框在任何狀況下都不出現。 |
名字衝突時,引發文件覆蓋,除非設置了FOF_RENAMEONCOLLISION標誌。 |
FOF_NOCONFIRMMKDIR |
抑制請求創建新文件夾的對話框 |
缺省目錄做爲嚴重錯誤產生一個錯誤消息框。 創建目錄的確認對話框做爲錯誤消息框是否顯示依賴於FOF_NOERRORUI的設置。 |
FOF_NOERRORUI |
抑制全部錯誤消息框。 |
優先於前一個標誌。若是設置,則,缺省目錄引發不被處理的異常,而且返回錯誤碼。 |
文件刪除是一個簡單的操做,它僅僅影響到輸入緩衝pFrom,而pTo緩衝被忽略。與文件複製同樣,操做的詳細狀況依賴於標誌的設置。相關的標誌是:
標誌 |
值 |
描述 |
FOF_SILENT |
0x0004 |
這個操做不回饋給用戶,就是說,不顯示進度對話框。相關的消息框仍然顯示。 |
FOF_NOCONFIRMATION |
0x0010 |
這個標誌使函數對任何遇到的消息框都自動回答Yes。 |
FOF_ALLOWUNDO |
0x0040 |
若是設置,這個標誌強迫函數移動被刪除的文件到‘回收站’中。不然,文件將被物理地從磁盤上刪除。 |
FOF_FILESONLY |
0x0080 |
設置這個標誌致使函數僅僅刪除文件,跳過目錄項。它僅僅應用於指定通配符的狀況。 |
FOF_SIMPLEPROGRESS |
0x0100 |
這致使簡化用戶界面。使之只有動畫而不報告被刪除的文件名。代之的是顯示lpszProgressTitle成員中指定的文字。(Win7實際中貌似不可用) |
FOF_NOERRORUI |
0x0400 |
若是設置了這個標誌,任何發生的錯誤都不能使消息框顯示,而是程序中返回錯誤碼。 |
這裏出現的標誌最要緊的是FOF_ALLOWUNDO,它決定文件是否一次就所有刪除,或存儲到‘回收站’中等候可能的恢復。若是FOF_ALLOWUNDO被設置,文件則被移動到回收站,而且這個操做能夠被Undo(儘管能夠手動Undo)。Undo特徵僅在刪除下可用,在拷貝與移動中沒有等價的操做。
MSDN資料中說明,SHFileOperation()在成功時返回0,失敗時返回非0值。顯然這是真的,但並非最有用的解釋。重複測試這個函數,能夠確信它有很是多的終止方式。事實上,咱們常常在系統錯誤的提示中運行,在有些地方這個函數只是簡單地返回從更靠近文件系統的其它程序中得到的返回碼。下面列表給出了SHFileOperation()返回的最一般的部分錯誤。
錯誤碼 |
描述 |
2 |
若是你試圖重命名多重文件,這個消息就會出現。描述是至關直接的:系統不能找到指定的文件。 |
7 |
在詢問是否想要置換給定文件時,你回答了‘取消’,函數就返回這個錯誤碼。它的描述也是至關的不明確—存儲控制塊被銷燬。 |
115 |
在試圖重命名文件到不一樣的文件夾時,發生這個文件系統錯。重命名文件只是改變文件名,而不能改變文件夾。 |
117 |
一個IOCTL錯(輸入/輸出控制),在目的路徑中有錯誤時或取消了新目錄的創建時,這個錯誤發生了。 |
123 |
你正在試圖重命名一個文件,然而你給出的名字是一個已經存在的文件。它也有一個無用的描述:文件名,目錄名,或卷標號的語法是不正確的。 |
1026
|
在試圖移動或拷貝一個不存在的文件時,出現這個文件系統錯。通常地,它提示了,源緩衝中的某些東西應該修改一下。這個錯誤碼彈出一個的錯誤框,你能夠經過設置FOF_NOERRORUI標誌抑制它的顯示。 |