硬汉嵌入式论坛

 找回密码
 立即注册
查看: 591|回复: 0
收起左侧

SHFileOperation() shell函数,用它可以实现各种文件操作

[复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2023-5-26 15:47:28 | 显示全部楼层 |阅读模式

SHFileOperation是一种shell函数,用它可以实现各种文件操作,如文件的拷贝、删除、移动等,该函数使用起来非常简单,它只有一个指向SHFILEOPSTRUCT结构的参数。使用SHFileOperation()函数时只要填写该专用结构--SHFILEOPSTRUCT,告诉Windows执行什么样的操作,以及其它重要信息就行了。SHFileOperation()的特别之处在于它是一个高级外壳函数,不同于低级文件处理。当调用SHFileOperation操作文件时,相应的外壳拷贝处理器(如果有的话)被调用。

[C] 纯文本查看 复制代码
=============================================
//函数原型:
int SHFileOperation( _Inout_ LPSHFILEOPSTRUCT lpFileOp);

//需要的库文件:
#include <Shlwapi.h>
#pragma comment (lib,"Shlwapi.lib")

//参数
lpFileOp : 一个指向SHFILEOPSTRUCT结构的指针
返回值: 返回0成功,

//SHFILEOPSTRUCT结构说明
typedef struct _SHFILEOPSTRUCT {
	HWND hwnd;
	UINT wFunc;
	PCZZTSTR pFrom;
	PCZZTSTR pTo;
	FILEOP_FLAGS fFlags;
	BOOL fAnyOperationsAborted;
	LPVOID hNameMappings;
	PCTSTR lpszProgressTitle;
} SHFILEOPSTRUCT, *LPSHFILEOPSTRUCT;
//成员说明:
	hwnd; //父窗口句柄, 0为桌面
	wFunc; 功能标识
		FO_COPY 复制
		FO_DELETE 删除
		FO_MOVE 移动
		FO_RENAME 重命名
	pFrom 源文件或者源文件夹,(source file)
	pTo 目的文件或文件夹 (destination)
	fFlags 控制文件的标志位
		FOF_ALLOWUNDO 准许撤销
		FOF_CONFIRMMOUSE 没有被使用,,,
		FOF_FILESONLY 通配符的文件名( *.* )只对文件(不是文件夹)进行操作。
		FOF_MULTIDESTFILES  The pTo member specifies multiple destination files (one for each source file in pFrom)
            rather than one directory where all source files are to be deposited.
		FOF_NOCONFIRMATION 不出现任何对话框
		FOF_NOCONFIRMMKDIR 创建文件夹的时候不用确认
		FOF_NO_CONNECTED_ELEMENTS Version 5.0适用,,不移动连接文件(connected files),只移动特定文件
		FOF_NOCOPYSECURITYATTRIBS  Version 4.71适用,,复制移动文件的时候不复制安全属性,而是为文件指定新的安全属性
		FOF_NOERRORUI 如果发生错误, 不要 显示对话框给用户
		FOF_NORECURSEREPARSE 没有被使用
		FOF_NORECURSION 不递归目录
		FOF_NO_UI   Windows Vista中,默默的进行操作,不给用户呈现任何UI。这相当于FOF_SILENT | FOF_NOCONFIRMATION | FOF_NOERRORUI |FOF_NOCONFIRMMKDIR 。
		FOF_RENAMEONCOLLISION 移动复制的时候如果名字重名,自动分配新名字
		FOF_SILENT 不显示进度条提示框
		FOF_SIMPLEPROGRESS 显示一个进度条,但不显示单个文件名,
		FOF_WANTMAPPINGHANDLE  如果指定了FOF_RENAMEONCOLLISION,说明此时是在重命名,
		     分配一个名称映射对象,其中包含他们的旧的和新的名字到hNameMappings成员。如果不再使用,需要用SHFreeNameMappings释放。
		FOF_WANTNUKEWARNING  当一个文件被永久删除的时候,弹出警告框
===================
实例:
BOOL CopyDirFileAPI(CString strSrcPath, CString strDesPath)
{
	//拷贝文件
	if (strSrcPath.GetAt(strSrcPath.GetLength()-1) == '\\' || strSrcPath.GetAt(strSrcPath.GetLength()-1) == '/')
	{
		strSrcPath = strSrcPath.Left(strSrcPath.GetLength()-1);
	}
	if (strDesPath.GetAt(strDesPath.GetLength()-1) == '\\' || strDesPath.GetAt(strDesPath.GetLength()-1) == '/')
	{
		strDesPath = strDesPath.Left(strDesPath.GetLength()-1);
	}
	
	char szFrom[MAX_PATH] = {0};
	char szTo[MAX_PATH] = {0};
	strSrcPath = strSrcPath+"\\*.*";
	strcpy(szFrom, (LPCTSTR)strSrcPath);
	szFrom[strSrcPath.GetLength()+1]='\0';
	//strDes=strDes+"\\*.*";
	strcpy(szTo,(LPCTSTR)strDesPath);
	szTo[strDesPath.GetLength()+1]='\0';
	
	int nOk=2000;
	char strTitle[] = "正在拷贝文件,请稍候..."; //进度条标题
	SHFILEOPSTRUCT FileOp;
	const char * From = szFrom;
	const char * To = szTo;
	FileOp.hwnd = this->m_hWnd;
	FileOp.wFunc = FO_COPY; //执行文件拷贝
	FileOp.pFrom = From;
	FileOp.pTo = To;
	FileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
	FileOp.hNameMappings = NULL;
	FileOp.lpszProgressTitle = strTitle;
	nOk = SHFileOperation(&FileOp);
	if (FileOp.fAnyOperationsAborted) //防止出现低配置光驱BUG
	{
		nOk=1;
	}
	if (nOk==1)
	{
		return false;
	}
	Sleep(200);
	return true;
}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 07:17 , Processed in 0.142597 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表