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


————————————————
版权声明:本文为CSDN博主「雾雨峰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/safeili/article/details/78720673

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值