|
這是網(wǎng)上找的一段代碼,但是在刪除目錄時(shí)總是說無法讀取源文件或磁盤。但是目錄確實(shí)存在。
查了查MSDN,網(wǎng)上看到別人也有同樣的問題,看看他們的解答。原來SHFileOperation中的pFrom可以表示多個(gè)路徑,各個(gè)路徑之間以'/0'分隔,最后以'/0/0'(即連續(xù)的兩個(gè)'/0')結(jié)束,
于是改了過來。可是還是不行。
去掉路徑最后的一個(gè)'/'("c://data//"改為"c://data"),成功。
下面這個(gè)函數(shù)需要注意同樣的問題。
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);如果執(zhí)行成功返回0.
1 typedef struct _SHFILEOPSTRUCT { 2 HWND hwnd;//指向發(fā)送消息的窗口 3 UINT wFunc;//執(zhí)行的操作 4 LPCTSTR pFrom;//源文件名 5 LPCTSTR pTo;//目標(biāo)文件名 6 FILEOP_FLAGS fFlags;//操作與確認(rèn)標(biāo)識(shí) 7 BOOL fAnyOperationsAborted;//操作是否終止 8 LPVOID hNameMappings;//文件映射 9 LPCTSTR lpszProgressTitle;//進(jìn)度條標(biāo)題10 } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
參數(shù)說明:
wFunc:要執(zhí)行的操作
1.FO_COPY:復(fù)制 2.FO_DELETE:刪除 3.FO_MOVE:移動(dòng) 4.FO_RENAME:重命名
pFrom:源文件名
MSDN上說要以兩個(gè)/0結(jié)束,所以一般的字符串必須還要加上一個(gè)/0
比如:
1 // 錯(cuò)誤的用法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:執(zhí)行標(biāo)識(shí)
1 FOF_SILENT //不產(chǎn)生正在復(fù)制的對話框2 FOF_NOCONFIRMMKDIR//如果目的目錄不存在,就默認(rèn)創(chuàng)建3 FOF_NOCONFIRMATION //不出現(xiàn)確認(rèn)文件替換對話框(默認(rèn)替換原來的文i件)4 FOF_NOERRORUI//不出現(xiàn)錯(cuò)誤對話框
注:最好不要同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因?yàn)镕OF_NOCONFIRMMKDIR屏蔽了missing directory Error,但FOF_NOERROR又屏蔽了missing directory Error,那么在同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR時(shí)也阻止了新目錄安靜(沒有用戶確認(rèn)要產(chǎn)生新目錄的對話框)的產(chǎn)生!!那么如何同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR? 就必須先確認(rèn)pTo所指定的目錄存在即可
1 BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib
如何判斷同時(shí)存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
=====
如果出現(xiàn)彈出"無法刪除 文件無法:讀取源文件或磁盤文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI
=====
1 FOF_RENAMEONCOLLISION//有重復(fù)文件時(shí)自動(dòng)重命名2 3 FOF_ALLOWUNDO //將文件放入回收站,否則直接刪除,一般這個(gè)最好做默認(rèn)
使用該函數(shù)進(jìn)行文件拷貝、移動(dòng)或刪除時(shí),如果需要的時(shí)間很長,則程序會(huì)自動(dòng)在進(jìn)行的過程中出現(xiàn)一個(gè)無模式的對話框(Windows操作系統(tǒng)提供的文件操作對話框),用來顯示執(zhí)行的進(jìn)度和執(zhí)行的時(shí)間,以及正在拷貝、移動(dòng)或刪除的文件名,此時(shí)結(jié)構(gòu)中的成員lpszProgressTitle顯示此對話框的標(biāo)題。fFlags是在進(jìn)行文件操作時(shí)的過程和狀態(tài)控制標(biāo)識(shí)。它主要有如下一些標(biāo)識(shí),也可以是其組合:
1 FOF_FILESONLY:執(zhí)行通配符,只執(zhí)行文件;2 3 FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復(fù)文件;
1 FOF_NOCONFIRMATION:在出現(xiàn)目標(biāo)文件已存在的時(shí)候,如果不設(shè)置此項(xiàng),則它會(huì)出現(xiàn)確認(rèn)是否覆蓋的對話框,設(shè)置此項(xiàng)則自動(dòng)確認(rèn),進(jìn)行覆蓋,不出現(xiàn)對話框。 2 3 FOF_NOERRORUI:設(shè)置此項(xiàng)后,當(dāng)文件處理過程中出現(xiàn)錯(cuò)誤時(shí),不出現(xiàn)錯(cuò)誤提示,否則會(huì)進(jìn)行錯(cuò)誤提示。 4 5 FOF_RENAMEONCOLLISION:當(dāng)已存在文件名時(shí),對其進(jìn)行更換文提示。 6 7 FOF_SILENT:不顯示進(jìn)度對話框。 8 9 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 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("正在進(jìn)行中"); 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("操作出現(xiàn)錯(cuò)誤!")); 22 else 23 MessageBox(_T("操作完成!")); 24 }25 else26 {27 MessageBox(_T("操作已終止!");28 }今天看到一個(gè)關(guān)于SHFileOperation函數(shù)使用的介紹,發(fā)現(xiàn)下面一些有用的資料,都是些之前未仔細(xì)了解的方面,這里把他們記錄下來,留待以后查閱參考。fFlags成員標(biāo)志間的關(guān)系
標(biāo)志 | 抑制的對話框 | 相關(guān)性與優(yōu)先級 |
FOF_MULTIDESTFILES | 無 | 無 |
FOF_FILESONLY | 無 | 無 |
FOF_SILENT | 如果設(shè)置,進(jìn)度對話框不顯示。 | 優(yōu)先于FOF_SIMPLEPROGRESS標(biāo)志。 |
FOF_SIMPLEPROGRESS | 無 | 為FOF_SILENT標(biāo)志所抑制。 |
FOF_RENAMEONCOLLISION | 如果設(shè)置了這個(gè)標(biāo)志,當(dāng)被移動(dòng)或拷貝的文件與已存在文件同名時(shí)置換對話框不會(huì)出現(xiàn)。 | 名字沖突時(shí),如果FOF_NOCONFIRMATION標(biāo)志設(shè)置,則操作繼續(xù)。 如果二者都設(shè)置了,則它優(yōu)先于FOF_NOCONFIRMATION。即,文件以給定的新名字復(fù)制,而不是覆蓋。 |
FOF_NOCONFIRMATION | 如果設(shè)置,確認(rèn)對話框在任何情況下都不出現(xiàn)。 | 名字沖突時(shí),引起文件覆蓋,除非設(shè)置了FOF_RENAMEONCOLLISION標(biāo)志。 |
FOF_NOCONFIRMMKDIR | 抑制請求建立新文件夾的對話框 | 缺省目錄作為嚴(yán)重錯(cuò)誤產(chǎn)生一個(gè)錯(cuò)誤消息框。 建立目錄的確認(rèn)對話框作為錯(cuò)誤消息框是否顯示依賴于FOF_NOERRORUI的設(shè)置。 |
FOF_NOERRORUI | 抑制所有錯(cuò)誤消息框。 | 優(yōu)先于前一個(gè)標(biāo)志。如果設(shè)置,則,缺省目錄引起不被處理的異常,并且返回錯(cuò)誤碼。 |
文件刪除是一個(gè)簡單的操作,它僅僅影響到輸入緩沖pFrom,而pTo緩沖被忽略。與文件復(fù)制一樣,操作的詳細(xì)情況依賴于標(biāo)志的設(shè)置。相關(guān)的標(biāo)志是:
標(biāo)志 | 值 | 描述 |
FOF_SILENT | 0x0004 | 這個(gè)操作不回饋給用戶,就是說,不顯示進(jìn)度對話框。相關(guān)的消息框仍然顯示。 |
FOF_NOCONFIRMATION | 0x0010 | 這個(gè)標(biāo)志使函數(shù)對任何遇到的消息框都自動(dòng)回答Yes。 |
FOF_ALLOWUNDO | 0x0040 | 如果設(shè)置,這個(gè)標(biāo)志強(qiáng)迫函數(shù)移動(dòng)被刪除的文件到‘回收站’中。否則,文件將被物理地從磁盤上刪除。 |
FOF_FILESONLY | 0x0080 | 設(shè)置這個(gè)標(biāo)志導(dǎo)致函數(shù)僅僅刪除文件,跳過目錄項(xiàng)。它僅僅應(yīng)用于指定通配符的情況。 |
FOF_SIMPLEPROGRESS | 0x0100 | 這導(dǎo)致簡化用戶界面。使之只有動(dòng)畫而不報(bào)告被刪除的文件名。代之的是顯示lpszProgressTitle成員中指定的文字。(Win7實(shí)際中貌似不可用) |
FOF_NOERRORUI | 0x0400 | 如果設(shè)置了這個(gè)標(biāo)志,任何發(fā)生的錯(cuò)誤都不能使消息框顯示,而是程序中返回錯(cuò)誤碼。 |
這里出現(xiàn)的標(biāo)志最要緊的是FOF_ALLOWUNDO,它決定文件是否一次就全部刪除,或存儲(chǔ)到‘回收站’中等候可能的恢復(fù)。如果FOF_ALLOWUNDO被設(shè)置,文件則被移動(dòng)到回收站,并且這個(gè)操作可以被Undo(盡管可以手動(dòng)Undo)。Undo特征僅在刪除下可用,在拷貝與移動(dòng)中沒有等價(jià)的操作。
MSDN資料中說明,SHFileOperation()在成功時(shí)返回0,失敗時(shí)返回非0值。顯然這是真的,但并不是最有用的解釋。重復(fù)測試這個(gè)函數(shù),可以確信它有非常多的終止方式。事實(shí)上,我們經(jīng)常在系統(tǒng)錯(cuò)誤的提示中運(yùn)行,在有些地方這個(gè)函數(shù)只是簡單地返回從更靠近文件系統(tǒng)的其它程序中獲得的返回碼。下面列表給出了SHFileOperation()返回的最通常的部分錯(cuò)誤。
錯(cuò)誤碼 | 描述 |
2 | 如果你試圖重命名多重文件,這個(gè)消息就會(huì)出現(xiàn)。描述是相當(dāng)直接的:系統(tǒng)不能找到指定的文件。 |
7 | 在詢問是否想要置換給定文件時(shí),你回答了‘取消’,函數(shù)就返回這個(gè)錯(cuò)誤碼。它的描述也是相當(dāng)?shù)牟幻鞔_—存儲(chǔ)控制塊被銷毀。 |
115 | 在試圖重命名文件到不同的文件夾時(shí),發(fā)生這個(gè)文件系統(tǒng)錯(cuò)。重命名文件只是改變文件名,而不能改變文件夾。 |
117 | 一個(gè)IOCTL錯(cuò)(輸入/輸出控制),在目的路徑中有錯(cuò)誤時(shí)或取消了新目錄的建立時(shí),這個(gè)錯(cuò)誤發(fā)生了。 |
123 | 你正在試圖重命名一個(gè)文件,然而你給出的名字是一個(gè)已經(jīng)存在的文件。它也有一個(gè)無用的描述:文件名,目錄名,或卷標(biāo)號(hào)的語法是不正確的。 |
1026
| 在試圖移動(dòng)或拷貝一個(gè)不存在的文件時(shí),出現(xiàn)這個(gè)文件系統(tǒng)錯(cuò)。一般地,它提示了,源緩沖中的某些東西應(yīng)該修改一下。這個(gè)錯(cuò)誤碼彈出一個(gè)的錯(cuò)誤框,你可以通過設(shè)置FOF_NOERRORUI標(biāo)志抑制它的顯示。 |
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注