CFileDialog 选择多个文件打开同时不同目录下,文件绝对路径不正确的问题

…衆ロ難τιáo~ 提交于 2019-11-26 04:26:09

使用CFileDialog 打开多个文件,获取文件路径。一般的使用情况为同一个文件夹目录下的某些文件,除文件名不一致外,前面路径均一样,使用GetStartPosition(),GetNextPathName()无问题;


但是对于打开文件夹目录,采用搜索的方式,显示出若干文件,且不在同一目录下,再采用上述方式,就出现了问题,不能准确获取前缀的文件夹目录地址,仅仅使用了第一个文件的绝对地址来覆盖后续的多选文件


查了好多资料,均给的第一种方式,但是并不能解决我所出现的问题,最后终于找到了一篇解决问题的帖子,现将代码等展示如下


参考地址:http://bbs.csdn.net/topics/391926645


两种方式代码如下:

方式1:

        CString strFilter = _T("所有支持的视频文件|*.ts;*.mp4;*.flv|MPEG-2 视频文件|*.ts|MPEG-4 视频文件|*.mp4|Adobe Flash Video|*.flv|其他文件类型|*.*||");
	CFileDialog dlg(TRUE, _T(""), _T(""), OFN_ALLOWMULTISELECT |OFN_ENABLESIZING|OFN_HIDEREADONLY, strFilter);

	// Create buffer for file names.
	const DWORD numberOfFileNames = 100;
	const DWORD fileNameMaxLength = MAX_PATH + 1;
	const DWORD bufferSize = (numberOfFileNames * fileNameMaxLength) + 1;
	TCHAR* filenamesBuffer = new TCHAR[bufferSize];

	// Initialize beginning and end of buffer.
	filenamesBuffer[0] = NULL;
	filenamesBuffer[bufferSize-1] = NULL;
	memset(filenamesBuffer,0,sizeof(TCHAR)*bufferSize);

	// Attach buffer to OPENFILENAME member.
	dlg.m_ofn.lpstrFile = filenamesBuffer;
	dlg.m_ofn.nMaxFile = bufferSize;
	// Create array for file names.
	CString fileNameArray[numberOfFileNames];
	if(dlg.DoModal() == IDOK)
	{
		// Retrieve file name(s).
		POSITION fileNamesPosition = dlg.GetStartPosition();
		int iCtr = 0;
		while(fileNamesPosition != NULL && iCtr < numberOfFileNames)
		{						
		    fileNameArray[iCtr] = dlg.GetNextPathName(fileNamesPosition);
                    //其中fileNameArray[iCtr] 中为路径地址
                   iCtr++;
		}  
	}

上述方式一不能满足搜索不同目录下同时打开多个文件的需求


方式二,此方式解决不同目录下同时打开多个文件获取文件路径的需求

        CString strFilter = _T("所有支持的视频文件|*.ts;*.mp4;*.flv|MPEG-2 视频文件|*.ts|MPEG-4 视频文件|*.mp4|Adobe Flash Video|*.flv|其他文件类型|*.*||");
	CFileDialog OpenDialog(TRUE, _T(""), _T(""),OFN_ALLOWMULTISELECT|OFN_ENABLESIZING|OFN_HIDEREADONLY,strFilter);
	if (OpenDialog.DoModal() == IDOK)
	{
		CString path;
		IShellItemArray *pResult=OpenDialog.GetResults();
		DWORD dwCount=0;
		IShellItem *pItem;
		WCHAR *pFilePath;
		pResult->GetCount(&dwCount);
		for (DWORD i=0;i<dwCount;i++)
		{
			pResult->GetItemAt(i,&pItem);
			pItem->GetDisplayName(SIGDN_FILESYSPATH,&pFilePath);//其中pFilePath为目标文件的绝对路径
		}
	}


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!