国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

SHFileOperation 刪除和拷貝文件

2019-11-11 03:14:23
字體:
供稿:網(wǎng)友

BOOL DeleteFolder(LPCTSTR lpszPath) {   SHFILEOPSTRUCT FileOp;   ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));  FileOp.fFlags = FOF_NOCONFIRMATION;   FileOp.hNameMappings = NULL;   FileOp.hwnd = NULL;   FileOp.lpszPRogressTitle = NULL;   FileOp.pFrom = lpszPath;   FileOp.pTo = NULL;   FileOp.wFunc = FO_DELETE;   return SHFileOperation(&FileOp) == 0;}

  這是網(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à)的操作。

SHFileOperation()函數(shù)的返回值

        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)志抑制它的顯示。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 阳城县| 榆中县| 永泰县| 南宁市| 漳平市| 苍南县| 武邑县| 上林县| 轮台县| 高青县| 涿州市| 兴安县| 桂阳县| 临汾市| 沙洋县| 宜州市| 岗巴县| 怀宁县| 英超| 墨玉县| 若尔盖县| 贵定县| 宁陵县| 凤城市| 聂拉木县| 金山区| 商城县| 叶城县| 泉州市| 金秀| 临邑县| 庆阳市| 福清市| 葫芦岛市| 六安市| 辽宁省| 石门县| 麻阳| 安多县| 沙洋县| 河北区|