|
這是網上找的一段代碼,但是在刪除目錄時總是說無法讀取源文件或磁盤。但是目錄確實存在。
查了查MSDN,網上看到別人也有同樣的問題,看看他們的解答。原來SHFileOperation中的pFrom可以表示多個路徑,各個路徑之間以'/0'分隔,最后以'/0/0'(即連續的兩個'/0')結束,
于是改了過來。可是還是不行。
去掉路徑最后的一個'/'("c://data//"改為"c://data"),成功。
下面這個函數需要注意同樣的問題。
BOOL CUsbCtrl::CopyFolder(CString lpszFromPath,CString lpszToPath){ lpszFromPath += '/0'; lpszToPath += '/0'; SHFILEOPSTRUCT FileOp; ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT)); FileOp.fFlags = FOF_NOCONFIRMATION ; FileOp.hNameMappings = NULL; FileOp.hwnd = NULL; FileOp.lpszProgressTitle = NULL; FileOp.pFrom = lpszFromPath; FileOp.pTo = lpszToPath; FileOp.wFunc = FO_COPY; return SHFileOperation(&FileOp) == 0;}其他
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 else26 {27 MessageBox(_T("操作已終止!");28 }今天看到一個關于SHFileOperation函數使用的介紹,發現下面一些有用的資料,都是些之前未仔細了解的方面,這里把他們記錄下來,留待以后查閱參考。fFlags成員標志間的關系
標志 | 抑制的對話框 | 相關性與優先級 |
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標志抑制它的顯示。 |
新聞熱點
疑難解答