【问题标题】:Multiple file selection from dialog box从对话框中选择多个文件
【发布时间】:2015-02-16 12:36:49
【问题描述】:

我想在 MFC 中启动一个对话框,选择多个文件并向用户显示该文件,然后将该文件复制到另一个位置。

我编写了这段代码来尝试实现这一点:

CFileDialog fOpenDlg(TRUE,"", " ", OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST, 
"Capture file (*.cap)|*.cap|", this);

fOpenDlg.m_pOFN->lpstrTitle="Import file";

fOpenDlg.m_pOFN->lpstrInitialDir="Desktop";

if(fOpenDlg.DoModal()==IDOK)
{
    POSITION pos=fOpenDlg.GetStartPosition();
    while(pos)
    {
        CString PathName=fOpenDlg.GetNextPathName(pos);
        CString strFileName=fOpenDlg.GetFilename();
        AfxMessageBox(strFileName);
    }
}

这样做的问题是,当我选择单个文件时,它会给出文件名,但是当我选择多个文件时,它不会给出任何文件名?

不知道是什么原因?

【问题讨论】:

    标签: mfc


    【解决方案1】:

    函数GetFileName 不适用于多个选定的文件(请参阅此MSDN 页面解释OFN_ALLOWMULTISELECT 的使用)。

    使用 GetStartPosition / GetNextPathName 函数,就像您在代码 sn-p 中所做的那样。

    如果您只想获取文件名,而不是每个文件的完整路径,请考虑使用 splitpath 函数,如下例所示:splitpath quesion on stackoverflow

    编辑: 要结束获取文件名,您可以添加类似于以下内容的函数:

    CString GetFileName(const CString& filePath)
    {
        TCHAR   drive[_MAX_DRIVE];
        TCHAR   dir[_MAX_DIR];
        TCHAR   fname[_MAX_FNAME];
        TCHAR   ext[_MAX_EXT];
    
        _tsplitpath_s(filePath, drive, dir, fname, ext);
    
        CString fileName;
        fileName.Format(_T("%s%s"), fname, ext);
        return fileName;
    }
    

    然后将显示消息框的代码替换为:

    AfxMessageBox(GetFileName(PathName));
    

    当我将它添加到您的代码示例时,这对我有用。

    【讨论】:

    • 我没有得到你想说的......我已经浏览了链接,但还有其他建议吗?
    • 我添加了一条关于如何使用 splitpath 获取文件名的建议。
    【解决方案2】:

    你想要的是:

    CFileDialog fOpenDlg(TRUE,"", " ", OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST, 
    "Capture file (*.cap)|*.cap|", this);
    
    fOpenDlg.m_pOFN->lpstrTitle="Import file";
    
    fOpenDlg.m_pOFN->lpstrInitialDir="Desktop";
    
    if(fOpenDlg.DoModal()==IDOK)
    {
        POSITION pos=fOpenDlg.GetStartPosition();
        while(pos)
        {
            CString PathName=fOpenDlg.GetNextPathName(pos);
            CString strFileName= ::PathFindFileName(PathName);
            AfxMessageBox(strFileName);
        }
    }
    

    注意CString strFileName= ::PathFindFileName(PathName); 行。

    【讨论】:

      猜你喜欢
      • 2014-04-01
      • 1970-01-01
      • 2012-10-06
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 2011-04-29
      相关资源
      最近更新 更多