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


使用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为目标文件的绝对路径
		}
	}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值