MFC下选择多个文件

窗口控件:CFileDialog

使用下面的代码进行初始化:

CFileDialog openDlg(TRUE,
	NULL,
	NULL,
	6UL|OFN_ALLOWMULTISELECT,
	"All Files|*.*||");

创建一个文件打开框对象,设置 OFN_ALLOWMULTISELECT(允许选择多个文件),6UL表示 OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY(隐藏只读,同时在覆盖现有文件前提示);

获取选择的内容:

IShellItemArray *lpResults = openDlg.GetResults();
if (NULL != lpResults)
{
	HRESULT hr;
	DWORD itemCount = 0;
	hr = lpResults->GetCount(&itemCount);
	if (FAILED(hr))
	{
		return vSelects;
	}

	for (DWORD index = 0; index < itemCount; index++)
	{
		IShellItem *ppsi = NULL;
		hr = lpResults->GetItemAt(index, &ppsi);
		if (FAILED(hr))
		{
			continue;
		}

		LPWSTR ppszName = NULL;
		hr = ppsi->GetDisplayName(SIGDN_FILESYSPATH, &ppszName);
		if (SUCCEEDED(hr))
		{
			vSelects.push_back(WcsToMbs(ppszName));
		}
	}
}

使用 GetResults返回一个迭代器,可以遍历选择内容;GetCount获取选择个数,GetItemAt获取指定的文件信息,内容以IShellItem类型指针返回;

GetDisplayName获取文件路径信息,SIGDN_FILESYSPATH表示要获取的信息类型,返回内容为LPWSTR(宽字符指针)类型,需要转换成多字节类型;

转换过程如下:

WcsToMbs(const LPWSTR _src)
{
	if (NULL == _src)
	{
		return "";
	}

	size_t mulLen = 0;
	size_t convLen = 0;
	// 获取转换需要的空间大小
	wcstombs_s(&mulLen, NULL, 0, _src, 0);

	unique_ptr<char[]> upChar = unique_ptr<char[]>(new char[mulLen + 1]);
	memset(upChar.get(), 0, mulLen + 1);
	
	wcstombs_s(&convLen, upChar.get(), mulLen, _src, mulLen);

	return string(upChar.get());
}

但是这种方法有一个问题,当路径中存在中文时就会转换失败,解决方法是使用下面的方法:

WcsToMbs(const LPWSTR _src)
{
	if (NULL == _src)
	{
		return "";
	}

	size_t mulLen = 0;
	size_t convLen = 0;
	// 获取转换需要的空间大小
	// wcstombs_s(&mulLen, NULL, 0, _src, 0);
	mulLen = WideCharToMultiByte(CP_ACP, 0, _src, wcslen(_src), NULL, 0, NULL, NULL);

	if (0 >= mulLen)
	{
		mulLen = MAX_PATH;
	}

	unique_ptr<char[]> upChar = unique_ptr<char[]>(new char[mulLen + 1]);
	memset(upChar.get(), 0, mulLen + 1);

	WideCharToMultiByte(CP_ACP, 0, _src, wcslen(_src), upChar.get(), mulLen, NULL, NULL);
	// wcstombs_s(&convLen, upChar.get(), mulLen, _src, mulLen);

	return string(upChar.get());
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值