Windows API——SHFileOperation——文件操作

1 int SHFileOperation( LPSHFILEOPSTRUCT lpFileOp);

如果执行成功返回0.

typedef struct _SHFILEOPSTRUCT {
	HWND hwnd;			//指向发送消息的窗口
	UINT wFunc;			//执行的操作
	LPCTSTR pFrom;			//源文件名
	LPCTSTR pTo;			//目标文件名
	FILEOP_FLAGS fFlags;		//操作与确认标识
	BOOL fAnyOperationsAborted;	//操作是否终止
	LPVOID hNameMappings;		//文件映射
	LPCTSTR lpszProgressTitle;	//进度条标题
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;

参数说明:

wFunc: 要执行的操作

FO_COPY:	复制
FO_DELETE:	删除
FO_MOVE:	移动
FO_RENAME:	重命名

pFrom:源文件名

MSDN上说要以两个\0结束,所以一般的字符串必须还要加上一个\0

比如:

// 错误的用法
LPTSTR pszSource = L"C:\\Windows";

// 正确的用法
LPTSTR pszSource = L"C:\\Windows\0";

对于CString,正确的用法是这样的

CString strSource("C:\\Windows");
strSource += '\0';//注意必须是'\0'而不是"\0"


fFlags: 执行标识

FOF_SILENT 		//不产生正在复制的对话框
FOF_NOCONFIRMMKDIR	//如果目的目录不存在,就默认创建
FOF_NOCONFIRMATION 	//不出现确认文件替换对话框(默认替换原来的文i件)
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所指定的目录存在即可
  

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

 如何判断同时存在FOF_NOERRORUI,FOF_NOCONFIRMMKDIR

=====

如果出现弹出"无法删除 文件无法:读取源文件或磁盘文.",可:FOF_NOCONFIRMATION|FOF_NOCONFIRMMKDIR|FOF_NOERRORUI

=====

FOF_RENAMEONCOLLISION	//有重复文件时自动重命名
FOF_ALLOWUNDO     	//将文件放入回收站,否则直接删除,一般这个最好做默认


 使用该函数进行文件拷贝、移动或删除时,如果需要的时间很长,则程序会自动在进行的过程中出现一个无模式的对话框(Windows操作系统提供的文件操作对话框),用来显示执行的进度和执行的时间,以及正在拷贝、移动或删除的文件名,此时结构中的成员lpszProgressTitle显示此对话框的标题。fFlags是在进行文件操作时的过程和状态控制标识。它主要有如下一些标识,也可以是其组合:

FOF_FILESONLY		//执行通配符,只执行文件;
FOF_ALLOWUNDO		//保存UNDO信息,以便在回收站中恢复文件;

FOF_NOCONFIRMATION	//在出现目标文件已存在的时候,如果不设置此项,则它会出现确认是否覆盖的对话框,设置此项则自动确认,进行覆盖,不出现对话框。
FOF_NOERRORUI		//设置此项后,当文件处理过程中出现错误时,不出现错误提示,否则会进行错误提示。
FOF_RENAMEONCOLLISION	//当已存在文件名时,对其进行更换文提示。
FOF_SILENT		//不显示进度对话框。
FOF_WANTMAPPINGHANDLE


在使用该函数删除文件时必须设置SHFILEOPSTRUCT结构中的神秘FOF_ALLOWUNDO标志,这样才能将待删除的文件拷到Recycle Bin,从而使用户可以撤销删除操作。需要注意的是,如果pFrom设置为某个文件名,用FO_DELETE标志删除这个文件并不会将它移到Recycle Bin,甚至设置FOF_ALLOWUNDO标志也不行,在这里你必须使用全路径名,这样SHFileOperation才会将删除的文件移到Recycle Bin。
例子:

CString strSrc("D:\\test1");
CString strDes("D:\\test2");
strSrc += '\0';//必须加'\0'
strDes += '\0';
SHFILEOPSTRUCT FileOp;
FileOp.fFlags = FOF_ALLOWUNDO|FOF_MULTIDESTFILES|FOF_SIMPLEPROGRESS;//
CString str("正在进行中");
str += '\0';
FileOp.lpszProgressTitle = str;
FileOp.hwnd =m_hWnd;
FileOp.hNameMappings = NULL;
FileOp.pFrom = strSrc; //
FileOp.pTo = strDes;
FileOp.wFunc = FO_COPY;

BOOL bOk;
bOk = SHFileOperation(&FileOp);
if (!FileOp.fAnyOperationsAborted)//终止
{
    if(bOk)
        MessageBox(_T("操作出现错误!"));
    else
        MessageBox(_T("操作完成!"));
}
else
{
    MessageBox(_T("操作已终止!");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值