需要添加頭文件:
#include <windows.h>
#include <shellapi.h>
需要指定shell32.lib或者shell32.dll鏈接
總結一下SHFileOperation的用法,希望對大家有用
//刪除文件或者文件夾
bool DeleteFile(char * lpszPath)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_ALLOWUNDO | //允許放回回收站
FOF_NOCONFIRMATION; //不出現確認對話(huà)框
FileOp.pFrom = lpszPath;
FileOp.pTo = NULL; //一定要是NULL
FileOp.wFunc = FO_DELETE; //刪除操作
return SHFileOperation(&FileOp) == 0;
}
//復制文件或文件夾
bool CopyFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION| //不出現確認對話(huà)框
FOF_NOCONFIRMMKDIR ; //需要時(shí)直接創(chuàng )建一個(gè)文件夾,不需用戶(hù)確定
FileOp.pFrom = pFrom;
FileOp.pTo = pTo;
FileOp.wFunc = FO_COPY;
return SHFileOperation(&FileOp) == 0;
}
//移動(dòng)文件或文件夾
bool MoveFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION| //不出現確認對話(huà)框
FOF_NOCONFIRMMKDIR ; //需要時(shí)直接創(chuàng )建一個(gè)文件夾,不需用戶(hù)確定
FileOp.pFrom = pFrom;
FileOp.pTo = pTo;
FileOp.wFunc = FO_MOVE;
return SHFileOperation(&FileOp) == 0;
}
//從命名文件或文件夾
bool ReNameFile(char *pTo,char *pFrom)
{
SHFILEOPSTRUCT FileOp={0};
FileOp.fFlags = FOF_NOCONFIRMATION; //不出現確認對話(huà)框
FileOp.pFrom = pFrom;
FileOp.pTo = pTo;
FileOp.wFunc = FO_RENAME;
return SHFileOperation(&FileOp) == 0;
}
void refilename(char *name)
{
int n;
char old[] = "/home/yuyang/zrgate1.7/ftp/log/log";
n = rename(old, name);
if (n == 0)
printf("the filerename complete\n");
else
printf("error");
}
應用舉例:
DeleteFile("d:\\PID\0\0"); //刪除一個(gè)文件夾
DeleteFile("d:\\PID.dsp\0d:\\PID.dsw\0\0"); //刪除多個(gè)文件
CopyFile("d:\0\0","D:\\MyProjects\\臨時(shí)程序\0\0"); //把"臨時(shí)程序"文件夾放到d盤(pán)下面
CopyFile("d:\0\0","D:\\MyProjects\\臨時(shí)程序\\PID.dsp\0D:\\MyProjects\\臨時(shí)程序\\PID.dsw\0"); //把PID.dsp和PID.dsw倆個(gè)文件放到d盤(pán)下面
ReNameFile("d:\\NewName","d:\\PID\0\0"); \\把PID文件夾從命名為NewName
注意:,如果你想把"D:\\MyProjects\\臨時(shí)程序\0\0"的文件夾復制到D盤(pán)下,并從命名為NewName,應該這樣
CopyFile("d:\\NewName\0\0","D:\\MyProjects\\臨時(shí)程序\\*.*\0\0"); //把"臨時(shí)程序"文件夾復制到d盤(pán)下并從命名為"NewName"
下面這個(gè)類(lèi)方便你復制多個(gè)文件或文件夾,僅作參考
//連接多個(gè)路徑的類(lèi)
class JOINFILEPATH
{
private:
int pos;
char* MultipleFilePath;
public:
JOINFILEPATH()
{
pos=0;
MultipleFilePath=new char[MAX_PATH*10];
memset(MultipleFilePath,0,MAX_PATH*10);
}
~JOINFILEPATH() { delete []MultipleFilePath; }
void join(char *FilePath)
{
while(*FilePath!='\0')
MultipleFilePath[pos++]=*FilePath++;
pos++;
}
char * GetMultipleFilePath() {return MultipleFilePath;}
};
//應用舉例:
JOINFILEPATH FilePath;
FilePath.join("D:\\MyProjects\\臨時(shí)程序\\PID\\PID.dsp");
FilePath.join("D:\\MyProjects\\臨時(shí)程序\\PID\\PID.dsw");
CopyFile("d:\0\0",FilePath.GetMultipleFilePath());
1 pFrom和pTo最好以\0\0結尾(把存放路徑的字符串初始化為0),不然有可能會(huì )出錯,中間的每一個(gè)路徑用\0隔開(kāi)
2 pFrom所指向的文件或文件夾(可以多個(gè))會(huì )被復制或移動(dòng)到pTo所指向的文件夾下面(假如文件夾不存在會(huì )詢(xún)問(wèn)是否創(chuàng )建,當然你也可以選擇直接創(chuàng )建)
參數詳解:
Typedef struct _ShFILEOPSTRUCT
{
HWND hWnd; //消息發(fā)送的窗口句柄;
UINT wFunc; //操作類(lèi)型
LPCSTR pFrom; //源文件及路徑
LPCSTR pTo; //目標文件及路徑
FILEOP_FLAGS fFlags; //操作與確認標志
BOOL fAnyOperationsAborted; //操作選擇位
LPVOID hNameMappings; //文件映射
LPCSTR lpszProgressTitle; //文件操作進(jìn)度窗口標題
}SHFILEOPSTRUCT, FAR * LPSHFILEOPSTRUCT;
在這個(gè)結構中,hWnd是指向發(fā)送消息的窗口句柄,pFrom與pTo是進(jìn)行文件操作的源文件名和目標文件名,它包含文件的路徑,對應單個(gè)文件的路徑字符串,或對于多個(gè)文件,必須以NULL作為字符串的結尾或文件路徑名之間的間隔,否則在程序運行的時(shí)候會(huì )發(fā)生錯誤。另外,pFrom和pTo都支持通配符*和?,這大大方便了開(kāi)發(fā)人員的使用。例如,源文件或目錄有兩個(gè),則應是:char pFrom[]="d:\\Test1\0d:\\Text.txt\0",它表示對要D:盤(pán)Test目錄下的所有文件和D:盤(pán)上的Text.txt文件進(jìn)行操作。字符串中的"\\"是C語(yǔ)言中的'\'的轉義符,'\0'則是NULL。wFunc 是結構中的一個(gè)非常重要的成員,它代表著(zhù)函數將要進(jìn)行的操作類(lèi)型,它的取值為如下:
FO_COPY: 拷貝文件pFrom到pTo 的指定位置。
FO_RENAME: 將pFrom的文件名更名為pTo的文件名。
FO_MOVE: 將pFrom的文件移動(dòng)到pTo的地方。
FO_DELETE: 刪除pFrom指定的文件。
使用該函數進(jìn)行文件拷貝、移動(dòng)或刪除時(shí),如果需要的時(shí)間很長(cháng),則程序會(huì )自動(dòng)在進(jìn)行的過(guò)程中出現一個(gè)無(wú)模式的對話(huà)框(Windows操作系統提供的文件操作對話(huà)框),用來(lái)顯示執行的進(jìn)度和執行的時(shí)間,以及正在拷貝、移動(dòng)或刪除的文件名,此時(shí)結構中的成員lpszProgressTitle顯示此對話(huà)框的標題。fFlags是在進(jìn)行文件操作時(shí)的過(guò)程和狀態(tài)控制標識。它主要有如下一些標識,也可以是其組合:
FOF_FILESONLY:執行通配符,只執行文件;
FOF_ALLOWUNDO:保存UNDO信息,以便在回收站中恢復文件;
FOF_NOCONFIRMATION:在出現目標文件已存在的時(shí)候,如果不設置此項,則它會(huì )出現確認是否覆蓋的對話(huà)框,設置此項則自動(dòng)確認,進(jìn)行覆蓋,不出現對話(huà)框。
FOF_NOERRORUI:設置此項后,當文件處理過(guò)程中出現錯誤時(shí),不出現錯誤提示,否則會(huì )進(jìn)行錯誤提示。
FOF_RENAMEONCOLLISION:當已存在文件名時(shí),對其進(jìn)行更換文提示。
FOF_SILENT:不顯示進(jìn)度對話(huà)框。
FOF_WANTMAPPINGHANDLE:要求SHFileOperation()函數返回正處于操作狀態(tài)的實(shí)際文件列表,文件列表名柄保存在hNameMappings成員中。
SHFILEOPSTRUCT結構還包含一個(gè)SHNAMEMAPPING結構的數組,此數組保存由SHELL計算的每個(gè)處于操作狀態(tài)的文件的新舊路徑。
在使用該函數刪除文件時(shí)必須設置SHFILEOPSTRUCT結構中的神秘FOF_ALLOWUNDO標志,這樣才能將待刪除的文件拷到Recycle Bin,從而使用戶(hù)可以撤銷(xiāo)刪除操作。需要注意的是,如果pFrom設置為某個(gè)文件名,用FO_DELETE標志刪除這個(gè)文件并不會(huì )將它移到Recycle Bin,甚至設置FOF_ALLOWUNDO標志也不行,在這里你必須使用全路徑名,這樣SHFileOperation才會(huì )將刪除的文件移到Recycle Bin。
轉自http://blog.csdn.net/jhb92/archive/2007/04/13/1563452.aspx
Shell的文件操作函數
SHFileOperation
功能:
1.復制一個(gè)或多個(gè)文件
2.刪除一個(gè)或多個(gè)
3.重命名文件
4.移動(dòng)一個(gè)或多個(gè)文件
有一樣的Win32API功能函數是:
CopyFile(),DeleteFile(),MoveFile()
MoveFile可以對文件重命名!
Win32 API 的層次比SHFileOperation低
SHFileOperation
的重要參數
1.wFunc //對pFrom pTo要執行的操作
2.fFlags //影響對wFunx的操作
3.hNameMappings //有系統填充,和你也可以填充
4.lpszProgressTitle
pFrom pTo 在結尾是兩個(gè)'\0\0'
通常用一個(gè)'\0',這樣會(huì )失敗的!!
當FOF_MULTIDESTFILES
szPFrom[lstrlen(szPFrom)+1]=0
szPFrom:必須先確定他所指定的文件存在!
可以是單個(gè)文件名,*.*,或包含統配符的文件名
注意必須是文件名,不是文件所在的文件夾名
szSource:可以是一個(gè)目錄,如果不是目錄,但又有
多個(gè)文件,那么必須和szPFrom的每一個(gè)文件對應,還要指定
FOF_MULTIDETFILES標志
Source and Target
多個(gè)文件---> 一個(gè)文件夾
許多單獨的文件---->一個(gè)文件夾
單獨文件--->單獨文件
許多單獨的文件---->許多單獨的文件
單獨文件:知道名字的文件
多個(gè)文件:帶有統配符的文件
注意到source中沒(méi)有對文件夾的操作!!
!!!!
SHFileOperation能操作網(wǎng)絡(luò )上的文件
如果你想將本地文件復制到192.168.1.99
那么只要在192.168.1.99上共享123目錄
然后將pTo設置為\\192.168.1.99\123
就可以了
但不要設置為\\192.168.1.99
對hNameMappings操作是Undocumented!!
如果沒(méi)有指定hNameMappings
那么hNameMappings一直是NULL
只有當某種操作(copy,move,rename)引起了文件名沖突了,hNameMappings才不是NULL!!!
當第一次copy某些文件到空目錄中時(shí)hNameMappings一定是NULL
所以hNameMappings只是內存中的一塊地區用來(lái)讓Explorer.exe保存被重命名的文件,以避免文件名沖突!
上面知道了如何才能使hNameMappings有效
現在如何使用hNameMappings,及其所指的結構大小?并取得這個(gè)內存塊的內容呢?
hNameMappings 是簡(jiǎn)單LPVOID無(wú)法使用loop
要使用hNameMappings,必須定義一個(gè)結構體
struct HANDLETOMAPPINGS {
UINT uNumberOfMappings; // number of mappings in array
LPSHNAMEMAPPING lpSHNameMapping; // pointer to array of mappings
};
但是可以寫(xiě)一個(gè)Enumerate function to enumerate lpSHNameMapping指向的內存塊,并且是讓W(xué)indow自己調用我的,不是我主動(dòng)調用,象Loop
相關(guān)聯(lián)接:
Q154123:File Name Mapping with Windows NT 4.0 Shell
Q133326:SHFILEOPSTRUCT pFrom and pTo Fields Incorrect
Q142066:PRB: SHGetNameMappingPtr() and SHGetNameMappingCount()
Manipulating Files with the SHFileOperation Function in Visual Basic 4.0
FOF_SILENT //不產(chǎn)生正在復制的對話(huà)框
FOF_NOCONFIRMMKDIR//如果目的目錄不存在,就默認創(chuàng )建
FOF_NOCONFIRMATION //不出現確認文件替換對話(huà)框(Confirmation Dialog)(默認替換原來(lái)的文i件)
FOF_NOERRORUI//不出現錯誤對話(huà)框
最好不要同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
因為FOF_NOCONFIRMMKDIR屏蔽了missing directory Error
但FOF_NOERROR又屏蔽了missing directory Error,那么在同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
時(shí)也阻止了新目錄安靜(沒(méi)有用戶(hù)確認要產(chǎn)生新目錄的對話(huà)框)的產(chǎn)生!!
那么如何同時(shí)使用FOF_NOERRORUI,FOF_NOCONFIRMMKDIR?
就必須先確認pTo所指定的目錄存在即可
BOOL MakeSureDiretoryPathExists(LPCSTR DirPath);
使用它要包含imagehlp.h和imagehlp.lib
如何判斷同時(shí)存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR
FOF_RENAMEONCOLLISION//有重復文件時(shí)自動(dòng)重命名
能產(chǎn)生對話(huà)框的標志:
FOF_SILENT //progress dialog
FOF_RENAMEONCOLLISION //replace dialog
FOF_NOCONFIRMATION //confirmation dialog
FOF_NOCONFIRMMKDIR //asks for your permission to create a new folder
FOF_NOERRORUI //error message
FOF_ALLOWUNDO //將文件放入回收站,否則直接刪除,一般這個(gè)最好做默認
(###)
聯(lián)系客服