Mfc “从中选择多个文件”对话框

Mfc “从中选择多个文件”对话框,mfc,Mfc,我想在MFC中启动一个对话框,选择多个文件并向用户显示此文件,然后将此文件复制到其他位置 我编写此代码是为了尝试实现这一点: CFileDialog fOpenDlg(TRUE,"", " ", OFN_ALLOWMULTISELECT|OFN_FILEMUSTEXIST, "Capture file (*.cap)|*.cap|", this); fOpenDlg.m_pOFN->lpstrTitle="Import file"; fOpenDlg.m_pOFN->lpstr

我想在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);
    }
}
问题是,当我选择单个文件时,它会给出文件名,但当我选择多个文件时,它不会给出任何文件名

我不知道原因是什么?

函数GetFileName不适用于多个选定的文件。请参阅本页,解释如何使用OFN_ALLOWMULTISELECT

使用GetStartPosition/GetNextPathName函数,就像您在代码段中已经做的那样

如果您只想获得文件名,而不是每个文件的完整路径,请考虑使用SimITPATH函数,如本例中所示:

编辑: 要获得文件名,您可以添加一个类似于以下内容的函数:

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));
当我将它添加到您的代码示例中时,它对我起了作用。

您想要的是:

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=::PathFindFileNamePathName;行。

我没有理解您想说的内容……我已经浏览了链接,但还有其他建议吗?我添加了一个建议,说明如何使用splitpath获取文件名。