C++文件操作之选择多个文件夹

前些日子有个需要选择多个文件夹来进行数据处理的需求,今天抽空写下博文记录。

首先先想到了CFileDialog这个文件选择类,我们都知道这个类可以实现弹出文件对话框,包括打开与保存文件,在网上搜索一番就可以看到该类的使用方法指南,此类博文数不胜数,加上查阅了微软对CFileDialog的介绍与使用示例,发现似乎只能多选文件,至于多选文件夹,正如其中有一句所说的,(To customize the dialog box, derive a class from CFileDialog, provide a custom dialog box template, and add a message map to process the notification messages from the extended controls. )因为默认的对话框是打开文件,如果要变更对话框类型,即自定义一个对话框,则要继承该类,提供自定义对话框模板,并添加消息映射以处理来自扩展控件的通知消息。emmm...,这个就pass了。

后面想起来之前辅导员提供的一个选择文件夹操作的类IFileDialog,既然能选择文件夹,推论一下应该也能多选文件夹,查阅了一下资料,果然发现了这类操作的相关接口,从微软对IFileDialog, IFileOpenDialog和 IFileSaveDialog的介绍和使用示例这个资料中可以知道这个是在Window Vista系统之后出现的新的打开/保存文件对话框的接口,因为链接中已经有详细的介绍,在这就不做赘述,直接上代码,在这里我使用的是IFileOpenDialog接口。

Vector vecRFileName;
DWORD dwFlags;
IFileOpenDialog *pfd = nullptr;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER,IID_PPV_ARGS(&pfd));
hr = pfd->GetOptions(&dwFlags);
hr = pfd->SetOptions(dwFlags | FOS_ALLOWMULTISELECT | FOS_PICKFOLDERS);//support multiselect folder;
hr = pfd->Show(this->m_hWnd);//show open file dlg;
IShellItemArray *pShellItem = nullptr;

if (hr == S_OK)
{
	hr = pfd->GetResults(&pShellItem);
	DWORD dwNumItems = 0;
	pShellItem->GetCount(&dwNumItems);
		
	for (int i = 0; i < dwNumItems; ++i)
	{
		IShellItem *pItem = nullptr;
		hr = pShellItem->GetItemAt(i, &pItem);
		LPWSTR lpSelect = nullptr;
		pItem->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &lpSelect);
		tstring strSelect(lpSelect);//file path
		vecRFileName.push_back(strSelect);//将获得的路径存入Vector容器中
		CoTaskMemFree(lpSelect);//free memory;
     }
}

.....//处理代码

其实代码中还需要一些防错处理,但被我省略掉了,比较规范的写法还是跟微软官方介绍的那样写,而且除了这个接口外,似乎还有一个接口,SHBrowseForFolder,也可以选择文件夹,对话框样式就是比较老的文件系统样式,也不知道是否也支持多选文件夹。就先这样吧。

你可能感兴趣的:(C++)