1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);
如果執行成功返回0.
1 typedef struct _SHFILEOPSTRUCT { 2 HWND hwnd;//指向發送消息的窗口 3 UINT wFunc;//執行的操作 4 LPCTSTR pFrom;//源文件名 5 LPCTSTR pTo;//目標文件名 6 FILEOP_FLAGS fFlags;//操作與確認標識 7 BOOL fAnyOperationsAborted;//操作是否終止 8 LPVOID hNameMappings;//文件映射 9 LPCTSTR lpszProgressTitle;//進度條標題 10 } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
參數說明:
wFunc:要執行的操作
1.FO_COPY:復制 2.FO_DELETE:刪除 3.FO_MOVE:移動 4.FO_RENAME:重命名
pFrom:源文件名
MSDN上說要以兩個\0結束,所以一般的字符串必須還要加上一個\0
比如:
1 // 錯誤的用法 2 LPTSTR pszSource = L"C:\\Windows"; 3 4 // 正確的用法 5 LPTSTR pszSource = L"C:\\Windows\0";
對於CString,正確的用法是這樣的
1 CString strSource("C:\\Windows"); 2 3 strSource += '\0';//注意必須是'\0'而不是"\0"!~!!
fFlags:執行標識
1 FOF_SILENT //不產生正在復制的對話框 2 FOF_NOCONFIRMMKDIR//如果目的目錄不存在,就默認創建 3 FOF_NOCONFIRMATION //不出現確認文件替換對話框(默認替換原來的文i件) 4 FOF_NOERRORUI//不出現錯誤對話框
注:最好不要同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因為FOF_NOCONFIRMMKDIR屏蔽了missing directory Error,但FOF_NOERROR又屏蔽了missing directory Error,那么在同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR時也阻止了新目錄安靜(沒有用戶確認要產生新目錄的對話框)的產生!!那么如何同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
就必須先確認pTo所指定的目錄存在即可
1 BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib
如何判斷同時存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
=====
如果出現彈出"無法刪除 文件無法:讀取源文件或磁盤文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI
=====
1 FOF_RENAMEONCOLLISION//有重復文件時自動重命名 2 3 FOF_ALLOWUNDO //將文件放入回收站,否則直接刪除,一般這個最好做默認
使用該函數進行文件拷貝、移動或刪除時,如果需要的時間很長,則程序會自動在進行的過程中出現一個無模式的對話框(Windows操作系統提供的文件操作對話框),用來顯示執行的進度和執行的時間,以及正在拷貝、移動或刪除的文件名,此時結構中的成員lpszProgressTitle顯示此對話框的標題。fFlags是在進行文件操作時的過程和狀態控制標識。它主要有如下一些標識,也可以是其組合:
1 FOF_FILESONLY:執行通配符,只執行文件; 2 3 FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復文件;
1 FOF_NOCONFIRMATION:在出現目標文件已存在的時候,如果不設置此項,則它會出現確認是否覆蓋的對話框,設置此項則自動確認,進行覆蓋,不出現對話框。 2 3 FOF_NOERRORUI:設置此項后,當文件處理過程中出現錯誤時,不出現錯誤提示,否則會進行錯誤提示。 4 5 FOF_RENAMEONCOLLISION:當已存在文件名時,對其進行更換文提示。 6 7 FOF_SILENT:不顯示進度對話框。 8 9 FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數返回正處於操作狀態的實際文件列表,文件列表名柄保存在hNameMappings成員中。 SHFILEOPSTRUCT結構還包含一個SHNAMEMAPPING結構的數組,此數組保存由SHELL計算的每個處於操作狀態的文件的新舊路徑。
在使用該函數刪除文件時必須設置SHFILEOPSTRUCT結構中的神秘FOF_ALLOWUNDO標志,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶可以撤銷刪除操作。需要注意的是,如果pFrom設置為某個文件名,用FO_DELETE標志刪除這個文件並不會將它移到Recycle Bin,甚至設置FOF_ALLOWUNDO標志也不行,在這里你必須使用全路徑名,這樣SHFileOperation才會將刪除的文件移到Recycle Bin。
例子:
1 CString strSrc("D:\\test1"); 2 CString strDes("D:\\test2"); 3 strSrc += '\0';//必須加'\0' 4 strDes += '\0'; 5 SHFILEOPSTRUCT FileOp; 6 FileOp.fFlags = FOF_ALLOWUNDO|FOF_MULTIDESTFILES|FOF_SIMPLEPROGRESS;// 7 CString str("正在進行中"); 8 str += '\0'; 9 FileOp.lpszProgressTitle = str; 10 FileOp.hwnd =m_hWnd; 11 FileOp.hNameMappings = NULL; 12 FileOp.pFrom = strSrc; // 13 FileOp.pTo = strDes; 14 FileOp.wFunc = FO_COPY; 15 16 BOOL bOk; 17 bOk = SHFileOperation(&FileOp); 18 if (!FileOp.fAnyOperationsAborted)//終止 19 { 20 if(bOk) 21 MessageBox(_T("操作出現錯誤!")); 22 else 23 MessageBox(_T("操作完成!")); 24 } 25 else 26 { 27 MessageBox(_T("操作已終止!"); 28 }