MFC从指定路径下打开一个文件夹

    项目中需要在在指定路径下导入一个目录,通过查找MSDN找到可以使用BROWSEINFO结构体来控制打开操作,该结构体解析如下:

typedef struct _browseinfo {
     HWND hwndOwner;            // 父窗口句柄
     LPCITEMIDLIST pidlRoot;    // 要显示的文件目录对话框的根(Root)
     LPTSTR pszDisplayName;     // 保存被选取的文件夹路径的缓冲区
     LPCTSTR lpszTitle;         // 显示位于对话框左上部的标题
     UINT ulFlags;              // 指定对话框的外观和功能的标志
     BFFCALLBACK lpfn;          // 处理事件的回调函数
     LPARAM lParam;             // 应用程序传给回调函数的参数
     int iImage;                // 文件夹对话框的图片索引
} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO
从中我们看到需要配置第2个参数pidlRoot来实现指定路径,因此需要得到当前目录下的LPCITEMIDLIST的一个指针,所以我们先编写一个子函数来获得该指针。

LPITEMIDLIST CFileView::GetIDListFromPath(CString strPathName)
{
	if(TRUE == strPathName.IsEmpty())
		return NULL;

	LPSHELLFOLDER pDesktopFolder = NULL;
	HRESULT hr = SHGetDesktopFolder( &pDesktopFolder );
	if ( FAILED(hr) )
	{
		return NULL;
	}
	// 得到文件路径对应的ItemIDList
	LPITEMIDLIST pItemIDList = NULL;
	LPWSTR  pPathName = strPathName.GetBuffer(strPathName.GetLength());
	hr = pDesktopFolder->ParseDisplayName( NULL, NULL,pPathName , NULL, &pItemIDList, NULL );
	pDesktopFolder->Release();
	if ( hr != S_OK )
	{
		return NULL;
	}

	return pItemIDList;
}
调用函数如下:

void CFileView::OnAddGroup()  //导入分组
{
	// TODO: 在此添加命令处理程序代码
	// prompt the user (with all document templates)
	CString strPrjPath(_T("D:\My Docs"));

	BROWSEINFO sInfo;  
	::ZeroMemory(&sInfo, sizeof(BROWSEINFO));  
	sInfo.pidlRoot   = GetIDListFromPath(strPrjPath);  
	sInfo.lpszTitle   = _T("请选择一个文件夹:");  
	sInfo.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE | BIF_EDITBOX;  
	sInfo.lpfn     = NULL;  

	 LPITEMIDLIST lpidlBrowse = ::SHBrowseForFolder(&sInfo);   
	 TCHAR pFolderPath[200]; //获得选定文件的目录
	 ::SHGetPathFromIDList(lpidlBrowse,pFolderPath);  
	
}



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