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

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

SHFileOperation 刪除和拷貝文件

2019-11-11 02:01:07
字體:
供稿:網(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)上找的一段代碼,但是在刪除目錄時總是說無法讀取源文件或磁盤。但是目錄確實存在。

  查了查MSDN,網(wǎng)上看到別人也有同樣的問題,看看他們的解答。原來SHFileOperation中的pFrom可以表示多個路徑,各個路徑之間以'/0'分隔,最后以'/0/0'(即連續(xù)的兩個'/0')結(jié)束,

于是改了過來。可是還是不行。

  去掉路徑最后的一個'/'("c://data//"改為"c://data"),成功。

 下面這個函數(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)識 7  BOOL fAnyOperationsAborted;//操作是否終止 8  LPVOID hNameMappings;//文件映射 9  LPCTSTR lpszProgressTitle;//進度條標(biāo)題10 } SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

 

 

參數(shù)說明:

wFunc:要執(zhí)行的操作

  1.FO_COPY:復(fù)制  2.FO_DELETE:刪除  3.FO_MOVE:移動  4.FO_RENAME:重命名

 

     pFrom:源文件名

       MSDN上說要以兩個/0結(jié)束,所以一般的字符串必須還要加上一個/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:執(zhí)行標(biāo)識

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)錯誤對話框

 

       注:最好不要同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR,因為FOF_NOCONFIRMMKDIR屏蔽了missing directory Error,但FOF_NOERROR又屏蔽了missing directory Error,那么在同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR時也阻止了新目錄安靜(沒有用戶確認(rèn)要產(chǎn)生新目錄的對話框)的產(chǎn)生!!那么如何同時使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?    就必須先確認(rèn)pTo所指定的目錄存在即可  

1   BOOL MakeSureDiretoryPathExists(LPCSTR DirPath); //使用它要包含imagehlp.h和imagehlp.lib

 

     如何判斷同時存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR

 =====

如果出現(xiàn)彈出"無法刪除 文件無法:讀取源文件或磁盤文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI

  ===== 

1  FOF_RENAMEONCOLLISION//有重復(fù)文件時自動重命名2 3  FOF_ALLOWUNDO     //將文件放入回收站,否則直接刪除,一般這個最好做默認(rèn)

 

   使用該函數(shù)進行文件拷貝、移動或刪除時,如果需要的時間很長,則程序會自動在進行的過程中出現(xiàn)一個無模式的對話框(Windows操作系統(tǒng)提供的文件操作對話框),用來顯示執(zhí)行的進度和執(zhí)行的時間,以及正在拷貝、移動或刪除的文件名,此時結(jié)構(gòu)中的成員lpszProgressTitle顯示此對話框的標(biāo)題。fFlags是在進行文件操作時的過程和狀態(tài)控制標(biāo)識。它主要有如下一些標(biāo)識,也可以是其組合:

  

1 FOF_FILESONLY:執(zhí)行通配符,只執(zhí)行文件;2 3 FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復(fù)文件;

 

 

 1   FOF_NOCONFIRMATION:在出現(xiàn)目標(biāo)文件已存在的時候,如果不設(shè)置此項,則它會出現(xiàn)確認(rèn)是否覆蓋的對話框,設(shè)置此項則自動確認(rèn),進行覆蓋,不出現(xiàn)對話框。 2  3   FOF_NOERRORUI:設(shè)置此項后,當(dāng)文件處理過程中出現(xiàn)錯誤時,不出現(xiàn)錯誤提示,否則會進行錯誤提示。 4  5   FOF_RENAMEONCOLLISION:當(dāng)已存在文件名時,對其進行更換文提示。 6  7   FOF_SILENT:不顯示進度對話框。 8  9    FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數(shù)返回正處于操作狀態(tài)的實際文件列表,文件列表名柄保存在hNameMappings成員中。SHFILEOPSTRUCT結(jié)構(gòu)還包含一個SHNAMEMAPPING結(jié)構(gòu)的數(shù)組,此數(shù)組保存由SHELL計算的每個處于操作狀態(tài)的文件的新舊路徑。

 

         在使用該函數(shù)刪除文件時必須設(shè)置SHFILEOPSTRUCT結(jié)構(gòu)中的神秘FOF_ALLOWUNDO標(biāo)志,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶可以撤銷刪除操作。需要注意的是,如果pFrom設(shè)置為某個文件名,用FO_DELETE標(biāo)志刪除這個文件并不會將它移到Recycle Bin,甚至設(shè)置FOF_ALLOWUNDO標(biāo)志也不行,在這里你必須使用全路徑名,這樣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("操作出現(xiàn)錯誤!"));   22         else   23             MessageBox(_T("操作完成!"));   24     }25     else26     {27         MessageBox(_T("操作已終止!");28     }
 今天看到一個關(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è)置,進度對話框不顯示。

優(yōu)先于FOF_SIMPLEPROGRESS標(biāo)志。

FOF_SIMPLEPROGRESS

為FOF_SILENT標(biāo)志所抑制。

FOF_RENAMEONCOLLISION

如果設(shè)置了這個標(biāo)志,當(dāng)被移動或拷貝的文件與已存在文件同名時置換對話框不會出現(xiàn)。

名字沖突時,如果FOF_NOCONFIRMATION標(biāo)志設(shè)置,則操作繼續(xù)。

如果二者都設(shè)置了,則它優(yōu)先于FOF_NOCONFIRMATION。即,文件以給定的新名字復(fù)制,而不是覆蓋。

FOF_NOCONFIRMATION

如果設(shè)置,確認(rèn)對話框在任何情況下都不出現(xiàn)。

名字沖突時,引起文件覆蓋,除非設(shè)置了FOF_RENAMEONCOLLISION標(biāo)志。

FOF_NOCONFIRMMKDIR

抑制請求建立新文件夾的對話框

缺省目錄作為嚴(yán)重錯誤產(chǎn)生一個錯誤消息框。

建立目錄的確認(rèn)對話框作為錯誤消息框是否顯示依賴于FOF_NOERRORUI的設(shè)置。

FOF_NOERRORUI

抑制所有錯誤消息框。

優(yōu)先于前一個標(biāo)志。如果設(shè)置,則,缺省目錄引起不被處理的異常,并且返回錯誤碼。

 

刪除文件

        文件刪除是一個簡單的操作,它僅僅影響到輸入緩沖pFrom,而pTo緩沖被忽略。與文件復(fù)制一樣,操作的詳細(xì)情況依賴于標(biāo)志的設(shè)置。相關(guān)的標(biāo)志是:

標(biāo)志

描述

FOF_SILENT

0x0004

這個操作不回饋給用戶,就是說,不顯示進度對話框。相關(guān)的消息框仍然顯示。

FOF_NOCONFIRMATION

0x0010

這個標(biāo)志使函數(shù)對任何遇到的消息框都自動回答Yes。

FOF_ALLOWUNDO

0x0040

如果設(shè)置,這個標(biāo)志強迫函數(shù)移動被刪除的文件到‘回收站’中。否則,文件將被物理地從磁盤上刪除。

FOF_FILESONLY

0x0080

設(shè)置這個標(biāo)志導(dǎo)致函數(shù)僅僅刪除文件,跳過目錄項。它僅僅應(yīng)用于指定通配符的情況。

FOF_SIMPLEPROGRESS

0x0100

這導(dǎo)致簡化用戶界面。使之只有動畫而不報告被刪除的文件名。代之的是顯示lpszProgressTitle成員中指定的文字。(Win7實際中貌似不可用)

FOF_NOERRORUI

0x0400

如果設(shè)置了這個標(biāo)志,任何發(fā)生的錯誤都不能使消息框顯示,而是程序中返回錯誤碼。

 

        這里出現(xiàn)的標(biāo)志最要緊的是FOF_ALLOWUNDO,它決定文件是否一次就全部刪除,或存儲到‘回收站’中等候可能的恢復(fù)。如果FOF_ALLOWUNDO被設(shè)置,文件則被移動到回收站,并且這個操作可以被Undo(盡管可以手動Undo)。Undo特征僅在刪除下可用,在拷貝與移動中沒有等價的操作。

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

        MSDN資料中說明,SHFileOperation()在成功時返回0,失敗時返回非0值。顯然這是真的,但并不是最有用的解釋。重復(fù)測試這個函數(shù),可以確信它有非常多的終止方式。事實上,我們經(jīng)常在系統(tǒng)錯誤的提示中運行,在有些地方這個函數(shù)只是簡單地返回從更靠近文件系統(tǒng)的其它程序中獲得的返回碼。下面列表給出了SHFileOperation()返回的最通常的部分錯誤。 

錯誤碼

描述

2

如果你試圖重命名多重文件,這個消息就會出現(xiàn)。描述是相當(dāng)直接的:系統(tǒng)不能找到指定的文件。

7

在詢問是否想要置換給定文件時,你回答了‘取消’,函數(shù)就返回這個錯誤碼。它的描述也是相當(dāng)?shù)牟幻鞔_—存儲控制塊被銷毀

115

在試圖重命名文件到不同的文件夾時,發(fā)生這個文件系統(tǒng)錯。重命名文件只是改變文件名,而不能改變文件夾。

117

一個IOCTL錯(輸入/輸出控制),在目的路徑中有錯誤時或取消了新目錄的建立時,這個錯誤發(fā)生了。

123

你正在試圖重命名一個文件,然而你給出的名字是一個已經(jīng)存在的文件。它也有一個無用的描述:文件名,目錄名,或卷標(biāo)號的語法是不正確的

1026

 

在試圖移動或拷貝一個不存在的文件時,出現(xiàn)這個文件系統(tǒng)錯。一般地,它提示了,源緩沖中的某些東西應(yīng)該修改一下。這個錯誤碼彈出一個的錯誤框,你可以通過設(shè)置FOF_NOERRORUI標(biāo)志抑制它的顯示。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 长垣县| 吉林省| 深水埗区| 元阳县| 虹口区| 沾化县| 荆州市| 神木县| 惠水县| 浮山县| 建瓯市| 腾冲县| 合川市| 浦北县| 高密市| 余庆县| 呼伦贝尔市| 融水| 泸溪县| 彩票| 高安市| 巴南区| 龙口市| 禹州市| 泾阳县| 洛浦县| 密云县| 平泉县| 吉木乃县| 丘北县| 修武县| 大名县| 岚皋县| 淮北市| 福泉市| 台南县| 临朐县| 吴江市| 伊川县| 乐清市| 德惠市|